美好的一天,
假设我在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中遗漏了一个简单的设计规则:)
答案 0 :(得分:3)
默认情况下,在STL中,来自两个不同容器的两个迭代器不具有可比性。这意味着,行为未指定。所以,你做任何你想做的事情,没有人应该尝试。
修改强>
仔细查看标准后,第24.1节第6段指出:
迭代器j被称为可到达 一个迭代器我,当且仅当有 有限的应用序列 使得i == j的表达式++ i。 如果j可以从i到达,则引用 到同一个容器。
这意味着如果您在两个不同的容器中允许i == j
i
和j
,那么您确实认为两个容器都是相同的。因为它们是不可改变的,所以完全没问题。只是一个语义问题。
答案 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中,比较规则是由容器的元素而不是容器本身驱动的,因此在我看来,你不应该在你的==运算符重载中执行自我取消引用。