【发布时间】:2014-08-31 16:35:52
【问题描述】:
我有一个大的排序整数向量。我需要快速找到并从数组中删除八个值。
例如,向量 a 包含元素
{1, 4, 7, 15, 16, 19, 24, 26, 31, 53, 67, 68, 73, 75, 77, 82}
向量 b 包含八个值
{4, 15, 19, 24, 67, 68, 73, 75}
完成操作后,向量a现在应该有
{1, 7, 16, 26, 31, 53, 77, 82}
我的旧解决方案很慢:
for (vector<int>::iterator val = b.begin(); val != b.end(); val++)
a.erase(remove(a.begin(), a.end(), *val), a.end());
有更快的方法吗?
编辑:
实际上,我的“A”向量比“B”向量大很多。也许最好只通过二分搜索搜索单个元素并删除它们?
EDIT2:
也许向量不是这种操作的好容器。我不认为我可以使用 forward_list 因为我不能用 C++11 编译。也许我可以使用不同的容器,然后将结果复制到向量中?
【问题讨论】:
-
你可以使用二分搜索来查找元素,但是你必须使用向量吗?这不是删除元素的最佳选择。
-
@mohaned 关于性能,实际上可能是这样,请参阅channel9.msdn.com/Events/GoingNative/GoingNative-2012/…
-
是的,我需要使用矢量。另外,我不能使用 C++11。
-
我认为搜索排序向量的最佳方法是二分搜索
O(lg(n)),因此您可以对 8 个值重复它并删除您的元素,@BaummitAugen 我很快就会阅读它。 -
其实,既然你提到它,我才意识到 remove() 不使用二分查找。我会在 stl 中查找二进制搜索算法。