c++ - 想要查看一个 vector 中的任何值是否与另一个 vector 中的值匹配

标签 c++ vector

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

最佳答案

蛮力方法是

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

如果两个 vector 的长度均为 n,则在未找到的情况下平均执行 n2 次比较。

这是二次方时间,O(n2 ),这是非常糟糕的。


为了获得更好的性能,您可以将一个 vector 的所有值放入一个集合。然后您可以根据集合检查另一个 vector 的每个值。对于 std::set,每个值的检查是 log(n),因此检查 n 值会得到 O( n log n) 时间。对于 std::unordered_set,检查基本上是常数时间,这将整个事情减少到 O(n)。

但是 std::unordered_set 有一个问题,至少对于我使用的 g++ 版本 (MinGW 5.1),它的标准库实现不支持散列 enum 值,因此您必须提供散列函数或一般散列支持才能使代码可移植。

所以,

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 添加值时更新此类集合。这增加了代码的复杂性,并且与您使用这些 vector 的目的无关。 IE。这是一种更具侵入性的解决方案:您通常会通过增加复杂性来支付性能费用。

关于c++ - 想要查看一个 vector 中的任何值是否与另一个 vector 中的值匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37900432/

相关文章:

c++ - OS X 获取远程进程输入参数有时会失败

c++ - 如何创建#define 来创建二维 vector ?

java - 我可以使用什么来代替 Java 中的 Vector?

c++ - 访问 4d vector 时出现问题

c++ - 第一个交换功能有什么问题?

c++ - Code::Blocks 中另一个项目对 func 的 undefined reference

R向量大小限制: "long vectors (argument 5) are not supported in .C"

r - 使用 purrr :map 将向量映射到键值列表

c++ - 如何在 C++ 中定义可变大小的 vector

c++ - 如何将成员函数传递给 SetConsoleCtrlHandler()?