在抛出std::length_error实例后,程序调用了terminate,异常信息:basic:string::_M_create。已中止(生成核心转储)

编程语言 2026-07-07

我正在解一个往年比赛中的题目,题目说输入里要放一个单词,输出里要把这个单词的字母按字母序排列后输出,同时还要输出它的倒序。当我在不调用 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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章