如何处理给定代码中的 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
使用 std::vector
的 default constructor (1) 初始化大小为 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());
如果它只是大约 printing/iterating 它的倒序,那么你甚至不需要中间向量:
// 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) << " ";
}
下面的 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
使用 std::vector
的 default constructor (1) 初始化大小为 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());
如果它只是大约 printing/iterating 它的倒序,那么你甚至不需要中间向量:
// 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) << " ";
}