测试两个迭代器是否来自同一个对象

时间:2013-07-05 15:18:02

标签: c++ templates iterator

给定两个相同类型的std :: iterators,如何测试来自同一个对象(不是类)?请注意,我不是在问如何比较它们的值。

std::string foo = "foo";
std::string bar = "bar";

std::string::iterator iter1 = foo.begin();
std::string::iterator iter2 = bar.begin();

if ( iter1 == iter2 )
{
    ...
}

以上应该而且确实失败了。我怎样才能在运行时检查这个?查看源代码,我看到相关方法调用iterator::_Compat()这是一个void方法,它执行我想要的检查但是在失败时它会发出调试断言。它将在发布版本中被忽略。

进一步看,我看到迭代器(至少对于字符串)有一个公共_GetCont()方法。所以

if ( iter1._GetCont() == iter2._GetCont() )

的工作原理。但是,这是无证的,导致我相信使用它是不安全的。

我的问题是如何以便携的方式完成上述工作?

另外需要注意的是,这是迭代器模板类的一部分。我将无法控制第二个迭代器。

2 个答案:

答案 0 :(得分:6)

  

我的问题是如何以便携的方式完成上述工作?

你做不到。

通常,迭代器不需要知道(或让知道)它们指向的容器。迭代器是指针的泛化,他们需要做的就是表现得像指针一样。

因此,他们可能允许取消引用,递增,递减,求和等等,具体取决于它们的类别,但C ++标准中没有关于让用户知道他们指向哪个容器,或者他们是否指向的迭代器要求与另一个迭代器相同的容器。

换句话说,迭代器范围的有效性应该是对该迭代器范围起作用的函数的前提条件。客户端有责任确保提供的迭代器指向同一个容器(并且第二个迭代器可以从第一个容器中到达)。

例如,标准图书馆如何处理此问题(C ++ 11标准第24.2.1 / 7段):

  

在数据结构上运行的大多数库的算法模板都有使用范围的接口。   范围是一对指定计算开始和结束的迭代器。范围[i,i)是一个范围   空的范围;通常,范围[i,j)是指以元素开头的数据结构中的元素   由i指出,但不包括j指向的元素。范围[i,j)当且仅当有效时才有效   j可以访问i将库中的函数应用于无效范围的结果未定义

答案 1 :(得分:0)

您可能想要比较指针

if ( &(*iter1) == &(*iter2) )
{
    ...
}