按范围我的意思是一对迭代器.在伪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
只有三个参数,而不是四个.
似乎没有标准的"单功能"方法.提到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)
对于非随机访问迭代器,上面的函数可以遍历包含两次,但使用标准函数.如果这是不可接受的,编写自己的实现可能是合理的.
如果可以确定两个范围的元素数完全相同,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)
但这几乎意味着要对元素进行两次比较(除非开始时有区别)。
归档时间: |
|
查看次数: |
4176 次 |
最近记录: |