c++ - 是否可以直接保留并复制到 std::string 中?
问题描述
是否可以在 std::string 中保留空间并获取将 char 数据直接复制到其中的指针?我必须与通过将字符串复制到 char * 中返回字符串的 C 库进行交互。如何设置 std::string 以便库可以直接写入其中,避免中间副本。
假设示例:
std::string mystring;
int strlen = foolib_get_string_size(fooval);
mystring.size(strlen); // assuming size() with arg exists and does reserve() and set size
foolib_string_to_char_buffer(fooval, mystring.data(), strlen); // abusing data() method for writing
解决方案
是否可以在 std::string 中保留空间并获取将 char 数据直接复制到其中的指针?
是的。使用它的resize()
方法分配内存,然后使用它的data()
方法(C++17 和更高版本)或它的operator[]
, 来访问该内存。
我必须与通过将字符串复制到 char * 中返回字符串的 C 库进行交互。如何设置 std::string 以便库可以直接写入其中,避免中间副本。
像这样:
std::string mystring;
int strlen = foolib_get_string_size(fooval);
if (strlen > 0)
{
mystring.resize(strlen); // -1 if strlen includes space for a null terminator
foolib_string_to_char_buffer(fooval, mystring.data()/*&mystring[0]*/, strlen);
}
或者,std::string
也有可以分配内存的构造函数:
int strlen = foolib_get_string_size(fooval);
std::string mystring(strlen, '\0'); // -1 if strlen includes space for a null terminator
if (strlen > 0)
foolib_string_to_char_buffer(fooval, mystring.data()/*&mystring[0]*/, strlen);
当然,这确实需要连续std::string
分配 's 内存块,这仅在 C++11 及更高版本中得到保证(但实际上,几乎在所有已知的实现中都已完成)。如果您不使用 C++11 或更高版本,并且真的想符合标准,那么您应该使用中间缓冲区,例如 a ,例如:std::vector
std::string mystring;
int strlen = foolib_get_string_size(fooval);
if (strlen > 0)
{
std::vector<char> myvector(strlen);
foolib_string_to_char_buffer(fooval, &myvec[0], strlen);
mystring.assign(&myvec[0], strlen); // -1 if strlen includes space for a null terminator
}
推荐阅读
- null - 当成员为 IEnumerable 时,有没有办法在使用 Mapster 进行映射期间忽略源中的所有空值
- sql - 如何提高包含 Update 的 Merge 语句的性能
- apache-flink - 当 Flink 源算子为并行时,单个分区的输入顺序是否有保证?
- php - 未生成 PHP-FPM 核心转储
- flutter - 来自API的Flutter ListView分页?
- javascript - onClick 事件监听器在一段时间内
- c++ - 类模板继承的“尚未声明”错误
- java - 在 Java 中使用过滤器表达式的 DynamoDb 查询
- flutter - FutureBuilder 没有进入 builder?
- oracle - 指示行是否是使用 SQL 而不是 DAX 的实体 ID 值的第一个实例的新列