我在我的代码中使用向量和向量size_type。
#include <iostream>
#include <vector>
using namespace std;
using std::vector;
typedef vector<int>::size_type size_type;
int main()
{
size_type n;
cin>>n;
vector<int> u(n,0);
for(size_type i = 0; i != n; ++i) {
cin >> u[i];
}
cout << *u.end();
return 0;
}
错误是当我输入n = 5时。向量请求5个元素,然后输出0或一些垃圾值。 如何打印最后一个元素?
答案 0 :(得分:12)
u.end()
是一个无法解除引用的迭代器(所谓的“通过结束迭代器”)。使用u.back()
获取最后一个值。
答案 1 :(得分:5)
错误在这里:
cout<<*u.end();
end()
迭代器指向一个超过向量结尾的元素。取消引用它始终是未定义的行为。
如果您有一个end()
迭代器并希望看到最后一个元素,请使用std::prev
,如下所示:
cout << *std::prev(u.end());
答案 2 :(得分:3)
u.end()
给出一个指向超出最后一个元素的迭代器;你必须减少它指向最后一个元素。你不能取消引用过去 - 结束迭代器;试图这样做会给出不确定的行为。
最后一个元素可用u.back()
。
答案 3 :(得分:2)
因为已经指出了thiis声明
cout<<*u.end();
导致打印垃圾值。成员函数end()返回的迭代器“指向”容器中最后一个实际元素之后。
与循环中的相同
for(size_type i=0; i!=n; ++i)
其中n的值从循环中排除。你可以用以下方式重写循环
for ( std::vector<int>::iterator it = u.begin(); it != u.end(); ++it )
实际上u.end()
等于u.begin() + n
如果n不是可接受的索引,则u.begin() + n
不是可以解除引用的迭代器。