将std::string转换为std::vector<char>

59

我正在使用一个库,该库接受以char向量的形式提供的数据。 我需要向该库传递一个string

我考虑使用接受迭代器的std::vector构造函数来执行转换 - 但想知道是否有更好的方法?

/*Note: json_str is of type std::string*/
const std::vector<char> charvect(json_str.begin(), json_str.end()); 

3
你只是好奇,还是实际测量并确定你的程序的重要部分花费在复制字符串上了? - Kerrek SB
4个回答

40

不错,这是一种直接使用字符串数据初始化向量的方法。

如@ildjarn在评论中指出的那样,如果由于某些原因您的数据缓冲区需要以空字符结尾,则需要使用charvect.push_back('\0')显式添加它。

还要注意,如果您想重复使用缓冲区,请使用接受迭代器的assign成员函数。


11
请注意,如果数据需要以 null 结尾,那么终止的 null 必须手动推回。 - ildjarn
6
不错的观点。然而,数据缓冲区以空字符结尾会有些奇怪,但你永远不知道…… - Xeo
请注意,自从C++11以来,std::string在其内部缓冲区中强制使用空终止字符串。因此,不再需要使用push_back。 - Manu343726
7
它仍然是。仅仅因为其内部必须以空字符结尾并不改变 '\0' 不是字符串元素的事实。如果你遍历这个字符串,你不会得到一个 '\0' - Xeo
我同意使用向量成员函数assign来设置新值。一般来说,最好利用类提供的成员函数,因为库开发人员有机会根据类来优化实现。 - Eric

19

你用于填充向量的方法很好 - 实际上,在大多数情况下,这可能是最佳选择。

但要让你知道的是,这不是唯一的方法。您还可以将字符串的内容简单地复制到vector<char>中。当您已经实例化vector或想要在末尾添加更多数据时,这将非常有用 - 或者在任何时候,都是如此。

例如,其中s是一个std::string,而v是一个std::vector<char>

std::copy( s.begin(), s.end(), std::back_inserter(v));
与构造函数的情况类似,如果需要空终止符,则需要自己将其推回:
v.push_back('\0');

2
你可以用这种方式来完成。
  std::string s = "Hello World!";
    std::vector<char> v(s.begin(), s.end());
    for (const char &c: v)
        std::cout << c;

0
如果你需要终止的空值,一个值得考虑的替代方案是:
std::vector<char> charvect(json_str.c_str(), json_str.c_str() + json_str.size() + 1); 

如果 charvect 已经存在,你可以这样做:

charvect.assign(json_str.c_str(), json_str.c_str() + json_str.size() + 1);

这可能比执行push_back('\0')更快,特别是如果push_back触发了内存重新分配。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接