关于容器的迭代器
我不知道,为什么它输出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.com的std::vector::end, std::vector::cend
返回指向向量最后一个元素之后的元素的迭代器。
此元素充当占位符;尝试访问它会导致未定义的行为。
意味着,任何事情都可能发生;因此,您不应该依赖其结果,也不应该这样做!
话虽如此,看起来您想要访问向量中的最后一个元素。如果是这种情况,对于非空向量, 您有多个其他(安全)选择:
-
使用
std::vector::back// prints first 8 from last; due to "default_container.pop_back()" std::cout << default_container.back(); -
使用
std::prev#include <iterator> // prints first 8 from last; due to "default_container.pop_back()" std::cout << *std::prev(default_container.end()); -
使用反向迭代器
std::rbegin// prints first 8 from last; due to "default_container.pop_back()" std::cout << *std::rbegin(default_container);
作为旁注,请参阅:Why is "using namespace std;" 被认为是不好的做法?