关于容器的迭代器

About iterator of containers

不知道,为什么会输出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

你的程序有Undefined behavior!

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

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

这给你未定义的行为。表格 cppreference.com std::vector::end, std::vector::cend

Returns an iterator to the element following the last element of the vector. This element acts as a placeholder; attempting to access it results in undefined behavior.

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


话虽如此,您似乎想要访问向量中的最后一个元素。如果是这样,对于非空向量,您还有多个其他(安全)选择:

  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;" considered bad practice?

前面的回答已经说明了一切。 换句话说,您不应该将 end() 用于其他任何事情,然后再将迭代器与之进行比较。 例如

for (auto it = container.begin(); it < container.end(); ++it)

另请注意您的行 (auto it : default_container) 不是在创建迭代器,而是字面上的 int。

// foreach value in container
for(int value : default_container) 
{
  cout << value;
}

请注意,如果您不打算更改要迭代的值,则可以使用此方法:

for(const auto value : default_container) {}

或者如果您的容器包含对象(类 的实例)

for(const auto& object : container) {}