我正在使用一个库,该库接受以char
向量的形式提供的数据。 我需要向该库传递一个string
。
我考虑使用接受迭代器的std::vector
构造函数来执行转换 - 但想知道是否有更好的方法?
/*Note: json_str is of type std::string*/
const std::vector<char> charvect(json_str.begin(), json_str.end());
我正在使用一个库,该库接受以char
向量的形式提供的数据。 我需要向该库传递一个string
。
我考虑使用接受迭代器的std::vector
构造函数来执行转换 - 但想知道是否有更好的方法?
/*Note: json_str is of type std::string*/
const std::vector<char> charvect(json_str.begin(), json_str.end());
不错,这是一种直接使用字符串数据初始化向量的方法。
如@ildjarn在评论中指出的那样,如果由于某些原因您的数据缓冲区需要以空字符结尾,则需要使用charvect.push_back('\0')
显式添加它。
还要注意,如果您想重复使用缓冲区,请使用接受迭代器的assign
成员函数。
std::string
在其内部缓冲区中强制使用空终止字符串。因此,不再需要使用push_back。 - Manu343726'\0'
。 - Xeoassign
来设置新值。一般来说,最好利用类提供的成员函数,因为库开发人员有机会根据类来优化实现。 - Eric你用于填充向量的方法很好 - 实际上,在大多数情况下,这可能是最佳选择。
但要让你知道的是,这不是唯一的方法。您还可以将字符串的内容简单地复制到vector<char>
中。当您已经实例化vector
或想要在末尾添加更多数据时,这将非常有用 - 或者在任何时候,都是如此。
例如,其中s
是一个std::string
,而v
是一个std::vector<char>
:
std::copy( s.begin(), s.end(), std::back_inserter(v));
与构造函数的情况类似,如果需要空终止符,则需要自己将其推回:v.push_back('\0');
std::string s = "Hello World!";
std::vector<char> v(s.begin(), s.end());
for (const char &c: v)
std::cout << c;
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触发了内存重新分配。