C++ 中带有向量的“std::out_of_range”实例
Posted
技术标签:
【中文标题】C++ 中带有向量的“std::out_of_range”实例【英文标题】:Instance of 'std::out_of_range' with vector in C++ 【发布时间】:2016-03-08 02:51:23 【问题描述】:-
嗨,我最近一直在使用矢量,但似乎当我输入“3+2+1”左右时,我的预期输出将是“1+2+3”控制台说:“在抛出后调用终止'std::out_of_range' 原始问题的一个实例来自:http://www.codeforces.com/problemset/problem/339/A。我的问题是什么?谢谢帮助!
#include <bits/stdc++.h>
using namespace std;
int main ()
ios_base::sync_with_stdio(false);
cin.tie(NULL);
vector <int> a;
string str;
cin>>str;
for(int i = 0; i < str.size(); i++)
if(str[i]!='+')
int c = str[i]-'0';
a.push_back(c);
sort(a.begin(), a.end());
cout<<a.at(0);
for(int j = 1; j < str.size(); j++)
cout<<'+'<<a.at(j);
return 0;
【问题讨论】:
【参考方案1】:您需要将循环的停止条件更改为在向量而不是字符串的大小上停止。因此,将最后一个循环更改为以下内容
for(int j = 1; j < a.size(); j++)
cout<<'+'<<a.at(j);
此外,如果您想以您指定的格式打印所有值,您需要执行以下操作
assert(!a.empty());
for(int j = 0; j < a.size() - 1; j++)
cout << a.at(j) << '+';
cout << a.back() << endl;
关于您的实施的最后一件事。如果您总是得到一个格式为“a+b+c+d”的字符串,则不需要向量来反转序列并打印。您可以简单地执行以下操作
std::reverse(str.begin(), str.end()); // #include <algorithm>
然后字符串将具有您想要的序列。如果您不想就地执行它并且需要另一个容器,您可以这样做
// #include <iterator> and #include <algorithm>
string other_string;
std::copy(str.crbegin(), str.crend(), std::back_inserter(other_string));
^ 这会将字符串以相反的顺序复制到另一个字符串对象。
【讨论】:
太好了,你说的很完美,非常感谢。我有一个问题,“assert(!a.empty());”有什么用 @DanielRodríguezMeza 如果答案是你想要的,你能接受吗?为此,您必须检查我的答案旁边略显灰色的复选标记。 非常感谢非常感谢,但无法理解“assert(!a.empty());”的用法 assert(!a.empty()) 将确保 a 不为空。如果 a 为空,则它变为 assert(!(true)) ,即 assert(false) 失败。 assert 可用于确保不变量和条件成立。在这里查看更多信息:cplusplus.com/reference/cassert/assert @Prith 谢谢你的澄清!以上是关于C++ 中带有向量的“std::out_of_range”实例的主要内容,如果未能解决你的问题,请参考以下文章
C++ 中带有 const 参数的 std::variant