有没有一种标准的方法来比较C++中的两个范围?

Ped*_*ino 21 c++ iterator stl

按范围我的意思是一对迭代器.在伪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";
}
Run Code Online (Sandbox Code Playgroud)

compare_range 当然是我正在寻找的功能.

免责声明:我知道,这是一个非常简单的写作功能.但像所有程序员一样,我试图变得懒惰;-)

fre*_*low 28

std::equal 是您正在寻找的功能模板.

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

请注意,std::equal只有三个参数,而不是四个.

  • C++ 14添加了4个参数版本,不同长度的范围返回false. (4认同)
  • 当用户保证两个间隔长度相同时,这种方法很好.否则可能会崩溃或工作不正常. (2认同)
  • @Alexander Poluektov:当第二个区间大于第二个区间时,方法std :: equal将使其等于第一个区间:例如输入{1,2,3}; {1,2,3,4}.某些应用可能不需要这样做 (2认同)

Ale*_*ler 8

使用std::equal- 它也支持范围.


Kon*_*zin 6

似乎没有标准的"单功能"方法.提到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 );
}
Run Code Online (Sandbox Code Playgroud)

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


Jam*_*nze 5

如果可以确定两个范围的元素数完全相同,std::equal则可以。在实践中,这似乎并不是我经常遇到的情况,std::equal实际上,我拥有的大多数用途是确定一个范围是否是另一个范围的前缀。

对于实际的比较,我发现std::lexicographical_compare 它更有用,尽管它所提供的关系只是顺序之一,而不是等价的关系。为了等效,您可以应用两次,例如

   !lexicographical_compare(a.begin(), a.end(), b.begin(), b.end())
&& !lexicographical_compare(b.begin(), b.end(), a.begin(), a.end())
Run Code Online (Sandbox Code Playgroud)

但这几乎意味着要对元素进行两次比较(除非开始时有区别)。