如何有效地使用载体

How to use vectors efficiently?

本文关键字:有效地      更新时间:2023-10-16

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

u.end()是一个不能取消引用的迭代器(所谓的"过去结束迭代器")。使用 u.back() 获取最后一个值。

错误在这里:

cout<<*u.end();

end()迭代器指向经过向量末尾的元素。取消引用它始终是未定义的行为。

如果你有一个end()迭代器,并且希望看到最后一个元素,请使用 std::prev ,如下所示:

cout << *std::prev(u.end());

u.end()给出了一个指向最后一个元素之外的迭代器;你必须递减它才能指向最后一个元素。你不能取消引用过去 - 结束迭代器;尝试这样做会产生未定义的行为。

最后一个元素可用作u.back()

因为它已经指向了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不是可以取消引用的迭代器。