C ++检查向量中的值是否存在于不同的向量中

时间:2014-04-17 22:36:14

标签: c++

我有3个问题的载体。其中两个向量已包含值,例如

v1 = {test1,test2,test3,test4,test5}
v2 = {test1, test2, random}

我想要做的是检查v1中是否存在v2中的任何值,并将该值添加到名为v3的vector中。 所以例如当我遍历v3时,输出应为:random 我还想指出v1和v2的大小可能更大,但v1总是更大。 我只需要有人帮助我,并指出我正确的方向。感谢

还有一种方法我可以做一个检查,让我们说如果v2中的所有值都在v1中这样做,但是如果v2中的任何值不在v2中,那么执行set_difference吗?

3 个答案:

答案 0 :(得分:2)

存在一种算法,set_difference

#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>

int main() {
    std::vector<int> v1 = { 10, 2, 3, 4, 5 };
    std::vector<int> v2 = { 2, 4, 666, 1 };

    std::sort(begin(v1),end(v1));
    std::sort(begin(v2),end(v2));

    std::vector<int> v3;
    v3.reserve( v2.size() ); // no more than one allocation
    std::set_difference( begin(v2), end(v2),  begin(v1), end(v1), std::back_inserter(v3) );

    for( auto e : v3 ) 
        std::cout << e << ", ";
}

答案 1 :(得分:1)

就我而言,以下功能将会解决:

template<typename T>
vector<T> contain(const vector<T>& v1, const vector<T>& v2)
{
        vector<T> v3;
        for (int i = 0; i < (int)v2.size(); i++) {
                for (int j = 0; j < (int)v1.size(); j++) {
                        if (v2[i] == v1[j]) v3.push_back(v1[i]);
                }
        }
        return v3;
}

这里我们只是遍历v2的每个条目并检查v1是否包含它,如果是,我们将此值添加到v3。复杂度为n^2,但如果模板参数具有可比性,则可以通过对向量进行排序来实现n*log(n)

答案 2 :(得分:0)

std::sort(v1.begin(), v1.end());
std::sort(v2.begin(), v2.end());

std::set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), std::back_inserter(v3));