关于容器的迭代器
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.
意味着,任何事情都可能发生;因此你不应该依赖它的结果也不应该这样做!
话虽如此,您似乎想要访问向量中的最后一个元素。如果是这样,对于非空向量,您还有多个其他(安全)选择:
-
// prints first 8 from last; due to "default_container.pop_back()"
std::cout << default_container.back();
-
#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;" 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) {}
不知道,为什么会输出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.
意味着,任何事情都可能发生;因此你不应该依赖它的结果也不应该这样做!
话虽如此,您似乎想要访问向量中的最后一个元素。如果是这样,对于非空向量,您还有多个其他(安全)选择:
-
// prints first 8 from last; due to "default_container.pop_back()" std::cout << default_container.back();
-
#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;" 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) {}