C++ 有没有标准的方法来比较C++;?

C++ 有没有标准的方法来比较C++;?,c++,stl,iterator,C++,Stl,Iterator,我所说的范围是指一对迭代器。在伪C++中: std::vector<int> v1 = { 1, 2, 3, 4, 5 }; std::vector<int> v2 = { 2, 3, 4 }; if( std::compare_range( v1.begin() + 1, v1.end() - 1, v2.begin(), v2.end() ) { std::cout << "Alright\n"; } std::vector v1={1,2,3,

我所说的范围是指一对迭代器。在伪C++中:

std::vector<int> v1 = { 1, 2, 3, 4, 5 };
std::vector<int> v2 = { 2, 3, 4 };
if( std::compare_range( v1.begin() + 1, v1.end() - 1, v2.begin(), v2.end() ) {
    std::cout << "Alright\n";
}
std::vector v1={1,2,3,4,5};
向量v2={2,3,4};
if(std::compare_范围(v1.begin()+1,v1.end()-1,v2.begin(),v2.end()){

std::cout
std::equal
是您正在寻找的函数模板

if (std::equal(v1.begin() + 1, v1.end() - 1, v2.begin())
{
    std::cout << "Alright\n";
}
if(std::equal(v1.begin()+1,v1.end()-1,v2.begin())
{

std::coutUse-它也支持范围。

似乎没有标准的“一个函数”方法。提到的std::equal假设第二个范围不小于第一个范围。例如,当第二个间隔为空时,这可能会导致内存损坏。当第二个范围较大时,它也不会给出答案

需要std::equal和std::distance的组合,或自编函数:

template <class InputIterator1, class InputIterator2>
bool safe_equal( InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2 )
{
  return ( std::distance( first1, last1 ) == std::distance( first2, last2 ) )
     && std::equal( first1, last1, first2 );
}
模板
bool safe_equal(InputIterator1 first1,InputIterator1 last1,InputIterator2 first2,InputIterator2 last2)
{
返回(std::distance(first1,last1)==std::distance(first2,last2))
&&标准::相等(第一个1,最后一个1,第一个2);
}

对于非随机访问迭代器,上面的函数可能会遍历Container两次,但使用标准函数。如果这是不可接受的,则编写自己的实现可能是合理的。

如果您有办法确定这两个范围 完全相同数量的元素,
std::equal
也可以 练习,这似乎不是我经常遇到的情况, 我对std::equal的大多数用法实际上都是 确定一个范围是否是另一个范围的前缀

对于实际比较,我发现
std::lexicographical\u compare
更有用,尽管它所带来的关系是 顺序的,而不是等价的。对于等价,你可以应用它 两次,例如

   !lexicographical_compare(a.begin(), a.end(), b.begin(), b.end())
&& !lexicographical_compare(b.begin(), b.end(), a.begin(), a.end())
但这几乎意味着两次比较元素(除非
开头有一个区别)。

Boost中有一个功能,它还检查范围的大小:

boost::range::equal
使用C++20:

if (std::ranges::equal( std::ranges::subrange{ v1.begin() + 1, v1.end() - 1 }, v2) {
    std::cout << "Alright\n";
}
if(std::ranges::equal(std::ranges::subrange{v1.begin()+1,v1.end()-1},v2){

std::cout不知怎么错过了。谢谢。现在我已经考虑过了,我显然不需要第四个参数…:)当用户保证两个间隔长度相同时,这个方法很好。否则它可能会崩溃,或者工作不正确。@Konstantin Tenzin:你可能是说“第二个间隔至少和第一个间隔一样长”@Alexander Poluektov:当第二个区间大于第二个区间时,方法std::equal将把它限定为等于第一个区间:例如输入{1,2,3};{1,2,3,4}。这可能不是某些应用程序所需的C++14添加了4参数版本,不同长度的范围返回false。比较如何?相等?相等?不相等?更高?更低?更热?更冷?更绿?更蓝?…@Tomalak Geret'kal:您忘记了“更好”.小语法修复:最后一个参数必须调用
last2
,而不是
second2
,并且
&
之后的第一个开括号是多余的。这是非常数学和深刻的。当元素比较相对便宜,范围大小昂贵时(例如,仅前向迭代器)-那么这个优雅的习惯用法就没有什么异议了。(当然,std::equal的4参数版本会更好,它还可以检查两个范围是否同时到达其端点()
if (auto cmp = std::lexicographical_compare_three_way(v1.begin() + 1, v1.end() - 1, v2.begin(), v2.end()); cmp == 0) {
    std::cout << "Alright\n";
}
else if (cmp < 0) {//...}