17

我在一个容器中有两个迭代器,一个是常量,一个是非常量。比较它们以查看它们是否都引用容器中的同一个对象是否存在问题?这是一个通用的 C++11 迭代器问题:

是否可以合法地比较 const 和非 const 迭代器以查看它们是否都引用同一个对象,而与容器的类型无关(即,它们都是保证引用同一容器或该容器末端的对象的迭代器(),但一个是 const,另一个不是)?

例如,考虑以下代码:

some_c++11_container container;

// Populate container
...

some_c++11_container::iterator iObject1=container.begin();
some_c++11_container::const_iterator ciObject2=container.cbegin();

// Some operations that move iObject1 and ciObject2 around the container
...

if (ciObject2==iObject1) // Is this comparison allowed by the C++11 standard?
  ...; //Perform some action contingent on the equality of the two iterators
4

4 回答 4

13

是的,这将像您期望的那样工作。

该标准保证对于任何容器类型,some_container::iterator都可以隐式转换为some_container::const_iterator.

23.2.1 [container.requirements.general] 中的第一个表,在定义X为包含类型对象的容器类型后T,具有:

表达:X::iterator

返回类型:值类型为的迭代器类型T

注意:任何满足前向迭代器要求的迭代器类别。可转换为X::const_iterator.


表达:X::const_iterator

返回类型:常量迭代器类型,其值类型为T

注意:任何满足前向迭代器要求的迭代器类别。

(这些不是真正的表达式,而是类型,而不是具有“返回类型”,但这就是它们被压缩到主要是表达式的表中的方式。)

因此,当您拥有时ciObject2==iObject1,编译器会注意到最好operator==的是ciObject2==some_container::const_iterator(iObject1). 并且operator==on twoconst_iterator告诉您它们是否引用相同的元素。

(我没有看到任何明确说明此转换的结果与原始对象相同的对象iterator。我想这只是理解。)

于 2013-06-03T15:53:11.423 回答
2

§24.2.3/1

如果满足(24.2.2) 和( Table 17 ) 要求,则类或指针类型X满足值类型的输入迭代器的要求......TXIteratorEqualityComparable

因此,输入迭代器必须是EqualityComparable

所有标准库容器迭代器都必须满足前向迭代器要求(§23.2.1 - 表 96)。由于这些要求是输入迭代器要求的超集,因此这些迭代器必须满足EqualityComparable概念。

此外,从§23.2.1 - Table 96 开始X::iterator需要可转换为 X::const_iterator.

将两者加在一起回答了您的问题,即标准确实要求将 aContainer::const_iterator与 a进行比较Container::iterator是明确定义的(只要两者都是指向同一容器的有效迭代器)。

于 2013-06-03T16:40:32.910 回答
1

我认为比较它们是不可能的。如果您在检查它是否是迭代器end()返回的结尾时有一个 const 迭代器,则它不是 const。

于 2013-06-03T15:42:00.897 回答
1

IIRCiterator隐式转换为const_iterator. 并且结果必须指向同一个位置。

如果是这样,混合比较将进行转换,然后比较现在兼容的 const_iterators。

于 2013-06-03T15:53:31.933 回答