代码之家  ›  专栏  ›  技术社区  ›  Khaled Alshaya

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

  •  2
  • Khaled Alshaya  · 技术社区  · 16 年前

    很好的一天,

    假设我在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 回复  |  直到 16 年前
        1
  •  3
  •   PierreBdR    16 年前

    默认情况下,在STL中,来自两个不同容器的两个迭代器是不可比较的。这意味着,行为是未指定的。所以你想做什么就做什么,谁都不应该尝试。

    编辑

    仔细阅读本标准后,第24.1节第6段规定:

    迭代器j称为可从 迭代器i,如果且仅当存在 有限序列的应用 使i==j的表达式++i。 如果J可以从我这里得到,他们指的是 到同一个容器。

    也就是说如果你允许的话 i == j 具有 i j 在两个不同的容器中,您真的认为两个容器是相同的。因为它们是不变的,所以这是完全正确的。只是一个语义问题。

        2
  •  1
  •   Manuel    16 年前

    你可能想查一下 boost::counting_iterator . 结合 boost::iterator_range 您将得到类似于您的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
    

    对于这个类,两个迭代器被认为是相等的,前提是它们包含相同的数字。但不可否认,情况与您的不同,因为这里的每个迭代器都不知道它属于哪个范围。

        3
  •  0
  •   Naveed    16 年前

    在STL中,比较规则是由容器的元素而不是容器本身驱动的,所以在我看来,在您的==操作符重载中,您不应该执行取消引用您的自身。