STL中迭代器和容器之间的关系

时间:2010-02-10 02:42:30

标签: c++ stl

美好的一天,

假设我在C ++中编写类似Python的范围。它提供随机访问容器的所有特征(当然是不可变的)。我想起了一个关于以下情况的问题:

我有两个不同的迭代器,指向范围容器的不同的实例。问题是这两个范围相等。即它们代表相同的范围。你会允许以下情况:

fact: range1 == range2 e.g.
---------------------------
range range1(10, 20, 1), range2((10, 20, 1);
range::iterator i = range1.begin(), j = range2.begin();
assert(i == j); // would you allow this?

很抱歉,如果我在STL中遗漏了一个简单的设计规则:)

3 个答案:

答案 0 :(得分:3)

默认情况下,在STL中,来自两个不同容器的两个迭代器不具有可比性。这意味着,行为未指定。所以,你做任何你想做的事情,没有人应该尝试。

修改

仔细查看标准后,第24.1节第6段指出:

  

迭代器j被称为可到达   一个迭代器我,当且仅当有   有限的应用序列   使得i == j的表达式++ i。   如果j可以从i到达,则引用   到同一个容器。

这意味着如果您在两个不同的容器中允许i == j ij,那么您确实认为两个容器都是相同的。因为它们是不可改变的,所以完全没问题。只是一个语义问题。

答案 1 :(得分:1)

您可能想要查看boost::counting_iterator。结合boost::iterator_range,您将得到类似于您的范围类的内容(除了它只允许步长为1):

auto rng = boost::make_iterator_range(boost::make_counting_iterator(0),
                                      boost::make_counting_iterator(10));
for(auto it = rng.begin(), e = rng.end(); it != e; ++it)
    std::cout << it << " "; // Prints 0,1,2,3,...,9

对于此类,如果两个迭代器包含相同的数字,则它们被认为是相等的。但诚然,情况与你的情况不同,因为这里每个迭代器都不知道它属于哪个范围。

答案 2 :(得分:0)

在STL中,比较规则是由容器的元素而不是容器本身驱动的,因此在我看来,你不应该在你的==运算符重载中执行自我取消引用。