如何有效地使用向量?

时间:2013-12-24 13:12:12

标签: c++ vector

我在我的代码中使用向量和向量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或一些垃圾值。 如何打印最后一个元素?

4 个答案:

答案 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不是可以解除引用的迭代器。