我声明了 char * array char *excluded_string[50] = { 0 };
稍后 ex_str 数组的每个元素都得到一个单词。现在我想把它转换成字符串,这样我就可以用空格分隔所有单词。
要将其转换为单个字符串:
char *excluded_string[50] = { 0 };
// excluded_string filled in the meantime
std::ostringstream buffer; // add #include <sstream> at the top of
// the file for this
for(int i = 0; i < 50; ++i)
buffer << excluded_string[i] << " ";
std::string result = buffer.str();
编辑:一些注意事项:
如果可能,不要直接连接字符串:这将创建和销毁大量对象并执行大量不必要的分配。
如果您的代码有严格的效率要求,请考虑预先分配/保留结果以确保单次分配而不是重复分配。
如果您连接字符串,请考虑使用运算符 += 而不是 + 和 =。
编辑2:(回答评论)
如果 + 和 = 而不是 += 会怎样?
这是连接字符串的两种选择的分辨率(s += s1 + s2 vs s += s1; s += s2):
代码:
std::string ss;
for (int i=0; i<50; i++)
ss += std::string(excluded_string[i]) + " ";
等效代码(就构造和分配的对象而言):
std::string ss;
for (int i=0; i<50; i++)
{
// ss += std::string(excluded_string[i]) + " ";
std::string temp1(excluded_string[i]); // "std::string(excluded_string[i])"
std::string temp2 = temp1 + " "; // call std::string operator+(std::string, char*)
ss += temp2; // call std::string::operator +=(std::string)
}
- temp1 每次迭代创建一次;
- temp2 是为连接运算符创建的
- 第二个临时附加到 ss。
两个临时对象都创建数据的副本(分配缓冲区、复制数据、释放缓冲区)。
代码:
std::string ss;
for (int i=0; i<50; i++)
{
ss += excluded_string[i]; // call std::string::operator +=(char*)
ss += " "; // same as above
}
预先分配/保留结果以确保单一分配
std::size_t total_length = 0;
for(int i = 0; i < 50; ++i)
total_length += std::strlen(excluded_strings[i]); // assumes argument is not null
std::string ss;
ss.reserve(total_length + 51); // reserve space for the strings and spaces between
for (int i=0; i<50; i++)
{
ss += excluded_string[i]; // calls std::string::operator +=
ss += " "; // same as above
}
在这种情况下, operator+= 不会在内部分配空间,只是在开头(单个操作)。这仍然有点慢,因为您对字符串进行了两次迭代(0->49),并对每个字符串进行了两次迭代(一次计算长度,一次将其复制到 ss)。
如果您的 exclude_string 是一个 std::vector ,它会更有效,因为计算字符串长度不会迭代每个字符串,只是向量)。