Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 返回数组的第一个元素,而不是之前的元素_C++_Stl_Stdmap - Fatal编程技术网

C++ 返回数组的第一个元素,而不是之前的元素

C++ 返回数组的第一个元素,而不是之前的元素,c++,stl,stdmap,C++,Stl,Stdmap,我正在尝试反向迭代std::map,代码如下: 它说: rend()返回一个反向迭代器,该迭代器引用映射容器中第一个元素之前的元素,该元素被视为其反向端点 请注意,rend与begin指的不是同一个元素,而是它前面的元素 map-m; m、 插入(对(.1,0)); m、 插入(对(.4,5)); map::reverse_iterator rend=m.rend(); map::iterator begin=m.begin(); 当我运行这个程序时,rend和begin都指向m的第一个元素(

我正在尝试反向迭代std::map,代码如下: 它说:

rend()返回一个反向迭代器,该迭代器引用映射容器中第一个元素之前的元素,该元素被视为其反向端点

请注意,rend与begin指的不是同一个元素,而是它前面的元素

map-m;
m、 插入(对(.1,0));
m、 插入(对(.4,5));
map::reverse_iterator rend=m.rend();
map::iterator begin=m.begin();
当我运行这个程序时,rend和begin都指向m的第一个元素(.1,0),考虑到上面的通知,它显然不应该指向。我觉得我犯了一些非常明显的错误,但我不知道这可能是什么


(C++,MSVC2010)

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

我不确定如何检查
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;
}
如果
rend
指向第一个元素,则不会打印0.1=>0


这是我的例子。你必须展示你的代码,在那里你得到了rend指向第一个元素的结论

我认为您缺少的一点是,如果使用调试器检查值,则
rend()
begin()
返回的值将包含相同的值。但是,迭代器类型的
操作符*
成员仍然允许您访问不同的对象

技术详细信息:
rend()
返回的值不能指向
begin()
之前,因为该值无效。因此决定
rend()
应包含
begin()
的值,并且所有其他反向迭代器应进一步移动一个位置。
操作符*
对此进行补偿,并访问正确的元素

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

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


您如何确定
rend
“指向”该项目?这不是一个确定的参考。你用什么方法确定了rend的指向?如果取消引用rend,则结果无效,因为这是未定义的行为。事实上,正如我所理解的,问题是
rend()
begin()
指向同一元素。但是,在您的示例中,您不打印
rend()
element@ArtakBegnazaryan:这是因为不应打印rend()。这就像说,让我们尝试访问并打印超过列表最后一个元素的空间。我的示例显示,由于rend不指向第一个元素,因此循环不会在第一个元素处停止,而是在到达终点时停止。如果rend确实等于begin,那么第一个元素将不会被打印,因为循环将在相等时终止。刚刚获得我的投票:)关键是我检查并打印了
rend()
的值,它实际上等于
begin()
(我知道这取决于实现,不由标准定义)。您的代码证明
rend()
begin()
指向的位置不同,但是它们的值可以相等。
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