如何简洁拼接存储std::string_view元素的C++容器
如何简洁拼接存放
std::string_view元素的容器 首先需要纠正你示例代码的核心错误:
你给出的理想实现存在内存安全问题:
std::string_view只是字符串的只读视图,不持有底层字符内存。如果返回函数内局部生成的拼接结果对应的std::string_view,会指向已经被释放的内存,触发未定义行为。所有拼接生成的新字符串,必须用std::string持有内存、管理生命周期。
具体实现可以选以下两种方案:
- 用高版本Boost的原生支持
Boost 1.78及以上版本的boost::algorithm::join已经原生支持std::string_view类型的范围输入,直接调用即可,不需要额外适配:#include <boost/algorithm/string/join.hpp> #include <vector> #include <string_view> #include <string> std::string unwords(const std::vector<std::string_view>& svVec) { return boost::algorithm::join(svVec, " "); } - 无依赖手写实现(兼容C++17及以上)
不想依赖Boost的话,自己实现逻辑也非常简洁,提前预计算总长度预留内存,性能比反复追加的写法更高:#include <vector> #include <string_view> #include <string> std::string unwords(const std::vector<std::string_view>& svVec) { if (svVec.empty()) return {}; // 预计算所需总内存,避免字符串动态扩容开销 size_t total_len = 0; for (auto sv : svVec) total_len += sv.size(); total_len += svVec.size() - 1; // 累加空格分隔符的长度 std::string res; res.reserve(total_len); res.append(svVec.front()); for (size_t i = 1; i < svVec.size(); ++i) { res.push_back(' '); res.append(svVec[i]); } return res; }
注意:如果后续需要使用std::string_view访问拼接结果,请在拿到返回的std::string后再自行构造视图,保证std::string的生命周期长于视图的使用周期,避免悬空引用。
内容的提问来源于stack exchange,提问作者gust
相关产品推荐
相关产品推荐

