如何在c ++中有效地比较集合?

nar*_*ren 6 c++ c++11

我想使用equal算法比较两组,但它给了我一个错误.怎么知道两套是否相等?

if(equal (a.begin(), a.end(), v.begin(), v.end())
Run Code Online (Sandbox Code Playgroud)

Ker*_* SB 12

你可以简单地说a == v,也许 a.size() == v.size() && a == v.它尽可能高效.(具有显式大小检查的后一种形式可能更好,因为set迭代器不是随机访问.) 更新:隐含尺寸检查[感谢@juanchopanza!]

  • 当然,实现*可以*实现比用于描述语义的算法效率低的算法,只要复杂性也相同.但是,编译器也可以在每个语句后插入一个5秒的无操作循环.在某些时候,你只需要假设编译器实现者不是一个完整的白痴(否则,切换编译器). (5认同)
  • @ RichardJ.RossIII:它是用`std :: equal`来指定的,它的复杂性和实际的比较数依次被指定. (2认同)

Chr*_*ica 5

你可能会调用带有3个迭代器和一个额外谓词的std::equal重载.所以只是放弃第二个结束,因为它不被解释为结束迭代器,而是一个谓词,这是垃圾:

std::equal(a.begin(), a.end(), v.begin())
Run Code Online (Sandbox Code Playgroud)

但是,正如马克在他的评论中所说的那样,你必须确保两个容器的大小都事先匹配,否则你就有可能跑到第二组的末尾.请注意,C++ 14确实会引入一个带有std::equal四个迭代器的重载(这是你想要的),并且会隐式地执行大小检查,但是你的实现似乎还不支持它.

除此之外,其他答案和评论都是正确的,因为a == v它更简单,更清晰,更简化.