我正在为一款名为Bulls& amp;的游戏编写代码。奶牛。我已经解决了看一个向量的值(如果它们在同一个索引中)是否相同。但是,我不知道如何编写一个for循环,它将遍历两个向量,并查看其中一个值是否与另一个向量中任何其他索引的值匹配。我将不胜感激任何帮助。谢谢!
答案 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
是否是最优雅的检查方式,因为我通常只需要包装标准库。
性能方面最好的方法是使用增量方法,例如每次向v1
或v2
添加值时更新此类集。这增加了代码的复杂性,并不依赖于您使用这些向量的内容。即这是一个更具侵入性的解决方案:您通常会通过增加复杂性来为性能付费。
答案 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的定义。