如何有效地使用载体
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
不是可以取消引用的迭代器。
相关文章:
- 有效地使用std::unordered_map来插入或增加键的值
- 如何有效地在 std::vector 中插入一对?
- 有效地计算多维数组的累积和?
- 如何有效地计算将单位立方体映射到自身的反射和旋转?
- 有效地将大数存储为 2 的幂用于路径问题
- 如何在C++中写入 1000 个文件时有效地缓冲
- 如何有效地找到数组中三元组和的最小差异?
- 如何在C++中有效地将数字值重新分配给字符数组
- C++有效地找到向量中第一个最接近的匹配值?
- 如何有效地操作满足给定谓词的向量中的所有项目?
- 有效地将数据加载到 std::vector 中<char>
- 如何在使用 cin 请求 int 时有效地使用户输入万无一失?
- C++:有效地将Sha256摘要放入OpenSSL Bignum?
- 如何有效地收集给定数组中的重复元素?
- 如何有效地修剪和合并四叉树中的节点?
- 可以有效地转换 std::any 与 std::any_cast
- 只需要知道我在c ++中打印模式的方式是否有效,或者有另一种方法可以有效地做到这一点
- 如何使用包含内部类的类实例有效地从内部类访问成员?
- 当表示为对象的一维向量时,有效地旋转 NxM 矩阵 (C++)
- 我们怎样才能有效地压缩DNA串