关于容器的迭代器

我不知道,为什么它输出1024

vector<int> default_container = { 1,2,3,4,5,6,7,78,8,1024 };
cout << *default_container.end() << endl; // 0
default_container.pop_back();

for (auto it : default_container) 
{
    cout << it << ",";
}
cout << endl;

cout << *default_container.end() << endl;   // 1024 why?why?why?why?
cout << *--default_container.end() << endl; // 8

回答

您的程序有未定义的行为

您正在取消引用结束迭代器,在行

cout << *default_container.end() << endl;
...
cout << *default_container.end() << endl;

这给了你未定义的行为。形成cppreference.comstd::vector::end, std::vector::cend

返回指向向量最后一个元素之后的元素的迭代器。
此元素充当占位符;尝试访问它会导致未定义的行为。

意味着,任何事情都可能发生;因此,您不应该依赖其结果,也不应该这样做!


话虽如此,看起来您想要访问向量中的最后一个元素。如果是这种情况,对于非空向量, 您有多个其他(安全)选择:

  1. 使用 std::vector::back

    // prints first 8 from last; due to "default_container.pop_back()"  
    std::cout << default_container.back(); 
    
  2. 使用 std::prev

    #include <iterator>
    
    // prints first 8 from last; due to "default_container.pop_back()"  
    std::cout << *std::prev(default_container.end()); 
    
  3. 使用反向迭代器 std::rbegin

    // prints first 8 from last; due to "default_container.pop_back()"  
    std::cout << *std::rbegin(default_container);
    

作为旁注,请参阅:Why is "using namespace std;" 被认为是不好的做法?


以上是关于容器的迭代器的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>