5

给定两个相同类型的 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() )

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

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

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

4

2 回答 2

8

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

你不能。

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

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

换句话说,迭代器范围的有效性应该是在该迭代器范围上工作的函数的先决条件。客户端有责任确保提供的迭代器指向同一个容器(并且第二个迭代器可以从第一个迭代器访问)。

例如,标准库是如何处理这个问题的(C++11 标准的第 24.2.1/7 段):

对数据结构进行操作的大多数库算法模板都有使用范围的接口。范围是一对指定计算开始和结束的迭代器。范围[i,i)是一个空范围;一般来说,范围[i,j)是指数据结构中的元素,从 指向的元素开始,i直到但不包括 指向的元素j[i,j)当且仅当 j可从 到达时,范围才有效i将库中的函数应用于无效范围的结果是未定义的

于 2013-07-05T15:22:52.550 回答
-1

您可能想要比较指针

if ( &(*iter1) == &(*iter2) )
{
    ...
}
于 2014-10-19T15:00:53.510 回答