想要查看一个向量中的任何值是否与另一个向量中的值匹配

时间:2016-06-18 18:41:41

标签: c++ vector

我正在为一款名为Bulls& amp;的游戏编写代码。奶牛。我已经解决了看一个向量的值(如果它们在同一个索引中)是否相同。但是,我不知道如何编写一个for循环,它将遍历两个向量,并查看其中一个值是否与另一个向量中任何其他索引的值匹配。我将不胜感激任何帮助。谢谢!

3 个答案:

答案 0 :(得分:3)

强力方法是

for( auto& x1 : vec1 )
    for( auto& x2 : vec2 )
        if( x1 == x2 )
            return true;
return false;

如果两个向量的长度为 n ,则在未找到的情况下执行 n 2 比较,平均值。

那是二次时间,O( n 2 ),这是非常不好的。

为了获得更好的性能,您可以将一个矢量的所有值放在中。然后,您可以检查另一个向量的每个值。对于std::set,每个值的检查都是log( n ),因此检查 n 值会给出O( n 日志 n )时间。对于std::unordered_set,检查基本上是恒定时间,这将整个事情减少到O( n )。

std::unordered_set存在问题,至少我使用的是g ++版本(MinGW 5.1),其标准库实现缺乏对散列enum值的支持,所以你' d必须提供散列函数或一般散列支持才能使代码可移植。

所以,

using Item = decltype(v1)::value_type;
std::set<Item> v1_values{ v1.begin(), v1.end() };
for( auto& x2 : v2 )
    if( v1_values.count( x2 ) > 0 )
        return true;
return false;

免责声明:编码器甚至没有看过代码,我不确定count是否是最优雅的检查方式,因为我通常只需要包装标准库。

性能方面最好的方法是使用增量方法,例如每次向v1v2添加值时更新此类集。这增加了代码的复杂性,并不依赖于您使用这些向量的内容。即这是一个更具侵入性的解决方案:您通常会通过增加复杂性来为性能付费。

答案 1 :(得分:0)

只需做一个简单的循环:

vector<int> v1, v2;
//Initialize v1 and v2...

for (auto& i: v1) //Loop through each element of v1
    for (auto& j: v2) //Same for v2
        if (i == j) 
             std::cout << "Ok! They match!" << std::endl;

答案 2 :(得分:0)

这是std::find_first_of的定义。