从另一个向量中搜索和查找一个向量中的元素的有效方法?

时间:2018-04-04 07:02:26

标签: c++ visual-c++ vector iterator find

我有两个std::vector<long>个。一个有5个元素,另一个有100个元素。我想比较较小矢量中的元素和较大的矢量,如果在较大的矢量中找不到元素,我想将其推回到较大的矢量中。我的代码在这里:

vector<long> Matvec, MatTempVec;
//assume Matvec has 5 elements and MatTempvec has 100 elements.

vector<long>::iterator It1;
for (auto it = Matvec.begin(); it != Matvec.end(); it++)
{
    It1 = find(MatTempVec.begin(), MatTempVec.end(), it);
    if (It1 != MatTempVec.end())
        MatTempVec.push_back(*it);
}

除了我上面所做的以外,建议我一个有效的搜索和查找方式。

2 个答案:

答案 0 :(得分:4)

首先,我希望你或者只是假设找到最好的算法&#34;对于一个问题,或者,你在谈论更大的数据集。

对于您拥有的数据量,不值得考虑这样的优化。

回答你的问题:

这实际上取决于你对矢量有多少限制。 如果您知道它们已经排序,则可以通过对两个向量进行一次迭代来轻松解决。 如果你知道它们是唯一的,你可能想要使用set。

如果你什么都不知道,你可能会想要使用set,就像临时数据结构一样,以便更快地查找。由于地点性,这在现实世界中可能会或可能不会更快

答案 1 :(得分:1)

正如其他人评论的那样,我认为你正在使用错误的工具来完成工作。最好使用一个本身支持唯一性的结构,比如std :: set。使用向量意味着检查列表中是否存在值的复杂性是O(n)(与列表的大小成线性比例),而使用std :: set会得到O(log(n))复杂性 - 这要好得多 - 因为std :: sets通常基于red/black trees

如果你真的坚持用矢量做它并且它们没有排序,那么你处在最糟糕的世界中你将最终做一个“笛卡尔 - 产品加入”,其中你的比较数量“正在做的是每组中行数的乘积(即在这种情况下为5x100 = 500)。当矢量很小时,这可能是可以接受的,但随着它们的增长,它会迅速扼杀你的表现。

所以,解决这个问题的方法之一就是:

但是,在选择排序算法时要小心,因为这也可能很昂贵,理想情况下存储排序结果并按排序顺序维护向量。如果你一直在重新排序,那也会破坏性能。

(或者,回到这个答案的顶部并重新考虑你坚持使用矢量的决定......)