3

我正在尝试通过 std::map 反向迭代,遵循以下代码:http ://www.cplusplus.com/reference/stl/map/rend/ 它说:

rend() 返回一个反向迭代器,它引用映射容器中第一个元素之前的元素,这被认为是它的反向端。

请注意,rend 不是指与 begin 相同的元素,而是指它之前的元素。

map<float,int> m;
m.insert(pair<float,int>(.1,0));
m.insert(pair<float,int>(.4,5));
map<float,int>::reverse_iterator rend=m.rend();
map<float,int>::iterator begin=m.begin();

当我运行它时,rend 和 begin 都指向 m 的第一个元素 (.1,0),但显然它不应该指向上面的通知。我觉得我犯了一些非常明显的错误,但我不知道它可能是什么。

(C++,MSVC2010)

4

3 回答 3

3

我相信您缺少的一点是,如果您使用调试器检查值,则返回的值rend()begin() 包含相同的值。但是,operator*迭代器类型的成员仍然可以让您访问不同的对象。

技术细节:返回的值rend()不能指向 before begin(),因为那是无效的。所以决定rend()应该包含的值begin()和所有其他反向迭代器进一步移动一个位置。对此operator*进行补偿并无论如何访问正确的元素。

24.5.1 反向迭代器的第一段说:

类模板 reverse_iterator 是一个迭代器适配器,它从其底层迭代器定义的序列的末尾迭代到该序列的开头。反向迭代器与其对应的迭代器 i 之间的基本关系由恒等式建立:
&*(reverse_iterator(i)) == &*(i - 1)

于 2012-04-21T19:47:40.543 回答
2

rend访问指向的元素是未定义的行为。它很可能会为您提供容器中的第一个项目或使您的应用程序崩溃或您能想象到的任何事情。此元素只是一个占位符,用于在迭代时指示容器结束(同样适用于end各种标准库容器)。

于 2012-04-21T18:30:27.130 回答
2

我不确定您如何检查rend指向的位置,但我运行了这个示例来反驳您的说法。

int main() {

    map<float,int> m;
    m.insert(pair<float,int>(.1,0));
    m.insert(pair<float,int>(.4,5));
    map<float,int>::reverse_iterator rend=m.rend();
    map<float,int>::iterator begin=m.begin();

    for ( rend=m.rbegin() ; rend != m.rend(); rend++ )
    cout << rend->first << " => " << rend->second << endl;
}

输出:

0.4 => 5
0.1 => 0

如果rend指向第一个元素,则不会打印 0.1 => 0。

这是我的例子。您必须展示您的代码在哪里实际得出结论,即rend 指向第一个元素。

于 2012-04-21T18:34:47.020 回答