如何以优雅/快速的方式将STL字符串向量转换为char*
How to convert STL string vector into char* in an elegant/quick way?
这分为更小的阶段:
- 如何计算向量中所有字符串的总长度?
- 分配char* mem空间
- 将向量字符串复制到该空格
是否有一种快速而优雅的方法来做到这一点?
我能想到的最优雅但可能不是最快的方法是:
std::string s = std::accumulate(v.begin(), v.end(), std::string());
char * c = new char[s.size() + 1];
std::strcpy(c,s.c_str());
虽然我自己不是裸动态分配的粉丝,而且我个人永远不会使用它,但我将把这个问题留给你来解决。
如果需要在元素之间添加空格分隔符,则会变得有点复杂,我可能会使用不同的解决方案,如:
std::ostringstream oss;
std::copy(v.begin(), v.end(), std::ostream_iterator<std::string>(oss," "));
size_t sz = oss.str().size();
if(sz) --sz; // truncate trailing space if there is one
char * c = new char[sz+1];
std::copy_n(oss.str().c_str(), sz, c);
c[sz] = 0;
下面是c++ 0x的实现:
#include <cstddef>
#include <algorithm>
#include <numeric>
#include <string>
#include <vector>
std::vector<char> concat_strings(std::vector<std::string> const& vecs)
{
std::size_t const cumulative_length = std::accumulate(
vecs.begin(),
vecs.end(),
static_cast<std::size_t>(0),
[](std::size_t const acc, std::string const& str)
{
return acc + str.size();
}
);
std::vector<char> ret;
ret.reserve(cumulative_length);
std::for_each(
vecs.begin(),
vecs.end(),
[&ret](std::string const& str)
{
ret.insert(ret.end(), str.begin(), str.end());
}
);
return ret;
}
得到的std::vector<char>
就是有效的char*
。
对于c++ 03,它将大致相同,但您需要适当的函函数来代替lambda(或使用c++ 03 lambda库,例如Boost.Phoenix)。
这不是一个优雅的要求,所以我想不出什么优雅的解决方案。
未测试的代码
vector<string> vec = ...;
size_t total_size = 0;
for (size_t i = 0; i < vec.size(); ++i)
total_size += vec[i].size();
char* mem = new char[total_size];
char* p = mem;
for (size_t i = 0; i < vec.size(); ++i)
{
memcpy(p, vec[i].data(), vec[i].size());
p += vec[i].size();
}
这是STL的方式:
#include <algorithm> // std::copy
#include <iostream> // std::cout
#include <iterator> // std::ostream_iterator
#include <sstream> // std::ostring_stream
#include <string> // std::string
#include <vector> // std::Vector
using namespace std;
typedef std::vector<std::string> string_vector;
int main( int argc, char ** argv )
{
string_vector v;
v.push_back("string 1, ");
v.push_back("string 2, ");
v.push_back("string 3");
std::ostringstream os;
std::copy( v.begin(), v.end(), std::ostream_iterator<std::string>( os, "" ) );
std::string result = os.str();
std::cout << "result: " << result << std::endl;
return 0;
}
输出:result: string 1, string 2, string 3
相关文章:
- 将stl字符串缩小到小于15个字符的容量
- 使用 char 分隔符解析C++中的字符串,但将可重复的字符保留为每个解析的子字符串 (C++ STL) 中的分隔符
- 如何使用 STL 算法将整数向量转换为字符串向量?
- 为什么 stl 字符串C++函数有时出错有时会出错?
- 在 stl 中的字符串中擦除关键字的工作?
- 有没有一种 STL 方法可以找到字符串的所有排列,给出一个以 C++ 为单位的大小?
- C++ wrt 字符串中的 STL 排序函数
- 将字符串流转换为 STL 容器
- 如何在不使用 STL 的情况下从函数反转字符串后返回字符串C++?
- 重新定义要在字符串的 STL 算法中使用的<运算符
- 从字符串(STL)中删除所有重复字符
- C++ STL 在逗号处拆分字符串
- 如何删除在没有STL的队列中存储在数组中的第一个字符串元素
- 寻找一种更有效的方法来使用 STL 函数检查字符串是否为回文
- C++STL字符串运算符+关联性
- 将字符串插入到c++stl集的时间复杂度
- 如何使用STL算法找到字符串中分隔两个不同字母的最短星号序列
- 使用stl替换嵌套的子字符串
- 循环访问字符串 (STL)
- c++转换成perl:如何使用c++11字符串STL函数