在抛出std::length_error实例后,程序调用了terminate,异常信息:basic:string::_M_create。已中止(生成核心转储)
我正在解一个往年比赛中的题目,题目说输入里要放一个单词,输出里要把这个单词的字母按字母序排列后输出,同时还要输出它的倒序。当我在不调用 inversa() 的情况下运行代码时,一切正常,但调用它时,我得到
terminate called after throwing an instanceof 'std::length:error' what(): basic:string::_M_create Aborted (core dumped)
我在 online-cpp.com 上跑我的代码,因为我不会用VS Code。
#include<bits/stdc++.h>
using namespace std;
string orden(string palabra){
vector<char>pal;
for(char letra : palabra){
pal.push_back(letra);
}
sort(pal.begin(), pal.end());
string enorden(pal.begin(), pal.end());
return enorden;
}
string inversa(string invpalabra){
vector<char>invpal;
for(char invletra : invpalabra){
invpal.push_back(invletra);
}
sort(invpal.begin(), invpal.end());
string inv(invpal.end(), invpal.begin());
return inv;
}
int main(){
string palabra;
cin >> palabra;
cout << orden(palabra) << " " << inversa(palabra);
return 0;
}
解决方案
你在注释里已经(算是)得到一个答案了,但这段代码:
string inv(invpal.end(), invpal.begin());
...不成立。要让这样的迭代器对成立,必须对第一个迭代器不断应用自增运算符,最终能得到第二个,但在这种情况下并非如此。为了让它工作,你可能需要类似如下:
string inv(invpal.rbegin(), invpal.rend());
虽然这与你提出的问题无关,但我想指出,std::sort 可以应用于大多数容器,而不仅仅是 std::vector。以 std::string 为例,它是一个容器。所以你可以做成如下:
string orden(string pal){
sort(pal.begin(), pal.end());
return pal;
}
当你想让字符串按逆序输出时,可以直接通过指定要使用的比较函数来实现,而不是先按顺序排序再把字符串倒序拷贝一份:
string inversa(string invpalabra){
std::sort(invpalabra.begin(), invpalabra.end(), std::greater<char>());
return invpalabra;
}
必要的附注
通常最好不要同时出现这两行:
#include<bits/stdc++.h>
using namespace std;
bits/stdc++.h是一个内部的gcc相关内容,只应由gcc团队使用。using namespace std;是一个初级的东西,任何人都不应该使用。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。