如何将std::vector<std::string>的元素复制到std::string中?为何代码崩溃?
为什么我的vector转string代码会崩溃?
你这个崩溃跟赋值运算符半毛钱关系都没有!问题出在空vector的下标越界访问上。
看你的代码:
std::vector<std::string> string_list; std::string str; string_list[0] = "abc"; // 这里已经炸了! str = string_list[0];
刚创建的string_list是个空容器,里面连一个元素都没有,你直接用[0]去访问第一个元素,这属于未定义行为——程序大概率会崩溃,或者出现各种奇怪的错误。
解决方法很简单,先确保vector里有元素再访问:
方法1:先添加元素再赋值
std::vector<std::string> string_list; std::string str; string_list.push_back(""); // 先添加一个空string到vector里 string_list[0] = "abc"; // 现在访问下标0就合法了 str = string_list[0]; // 赋值完全没问题
方法2:直接初始化时添加元素
std::vector<std::string> string_list = {"abc"}; // 直接初始化带一个元素 std::string str; str = string_list[0]; // 正常赋值
另外,如果你想避免越界访问的风险,可以用at()方法代替下标运算符[]——at()会在越界时抛出std::out_of_range异常,而不是直接崩溃,方便你调试:
try { string_list.at(0) = "abc"; } catch (const std::out_of_range& e) { std::cout << "访问越界了:" << e.what() << std::endl; }
总结一下:赋值运算符=在这里完全可以正常使用,崩溃的根源是你访问了空vector的不存在的下标。
内容的提问来源于stack exchange,提问作者oops
相关产品推荐
相关产品推荐

