如何处理给定代码中的 std::out_of_range 错误?
How to deal with std::out_of_range error in the given code?
在C++下面代码应该反转向量。
#include <bits/stdc++.h>
using namespace std;
vector<int> reverseArray(vector<int> a){
vector<int> b;
for (int i=0;i<a.size();i++){
b.at(i) = a.at(a.size()-i-1);
}
return b;
}
int main(){
int input;
vector<int> arr;
// read vector
while(cin >> input){
arr.push_back(input);
}
// print vector
for (int i=0;i<arr.size();i++){
cout << arr.at(i) << " ";
}
cout << endl <<"Reversed vector is:- ";
vector<int> r_arr = reverseArray(arr);
// print reversed vector
for (int i=0;i<r_arr.size();i++){
cout << arr.at(i) << " ";
}
}
但是,抛出的错误如下所示:-
terminate called after throwing an instance of 'std::out_of_range'
what(): vector::_M_range_check: __n (which is 0) >= this->size() (which is 0)
Aborted (core dumped)
我检查了 a.size((-i-1 在 a.size(( = 6 时从 5 到 0 变化。那为什么代码不起作用呢?问题出在哪里?
请帮忙,我正在学习C++STL。
std::vector<int> b
使用默认的构造函数 (1(std::vector
,该构造函数以0
的大小初始化向量,因此b.at(i)
将始终超出范围。
您需要使用与使用std::vector<int> b(a.size())
a
相同的大小初始化它。
但是使用反向迭代器(rbegin()
,rend()
(反转容器要容易得多:
std::vector<int> reverseArray(vector<int> a){
std::vector<int> b(a.rbegin(), a.rend());
return b;
}
所以你实际上不需要一个函数:
cout << endl << "Reversed vector is:- ";
std::vector<int> r_arr(arr.rbegin(), arr.rend());
如果它只是关于按 revers 顺序打印/迭代它,那么你甚至不需要中间向量:
// print vector reversed
for (auto it=arr.rbegin(); it!=arr.rend(); it++){
cout << (*it) << " ";
}
如果您想就地反转现有容器并且不需要原始订单,您可以使用std::reverse
std::reverse(std::begin(arr), std::end(arr));
for( auto i: arr ) {
cout << i << " ";
}
除了学习目的,绝对没有理由使用循环手动反转数组。
在开始任意分配之前,您需要确保b
的大小与a
相同。只需一个额外的构造函数参数即可:
vector<int> reverseArray(vector<int> a){
vector<int> b(a.size());
for (int i=0;i<a.size();i++){
b.at(i) = a.at(a.size()-i-1);
}
return b;
}
此外,打印出反向数组的最后一个循环是在cout
中索引错误的数组。其内容应为:
// print reversed vector
for (int i=0;i<r_arr.size();i++){
cout << r_arr.at(i) << " ";
}
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- 在 std::unordered_map 中插入新的键/值对会导致"out of range"异常
- swig perl typemap(out) std::vector<std::string> 在 perl 中不返回所需的输出
- "friend std::ostream& operator<<(std::ostream& out, LinkedList& list)"是什么意思?
- 尝试同时写入 std:out 和文件
- 错误:非静态引用成员"std::ostream&Student::out",无法使用默认赋值运算符
- c ++如何使我.get() std::future out of a vector.
- 如何在 Linux 中将孩子的进程 std (out / err) 设置为父级
- fstream::open() Unicode 或非 ASCII 字符在 Windows 上不起作用(使用 std::ios::out)
- C++同时写入 std::out 和 std:clog
- Printing out std::map
- 将Std::vector通过ref / out从c#传递到c++
- QTextStream and std out
- 聚合'std::stringstream out'具有不完整的类型,无法定义 [C++]
- 以std:: Fstream::in | std:: Fstream::out | std:: Fstream::app