[英]Most efficient way to concatenate multiple strings in C++
我想找到连接多个std::string
类型字符串的最有效方法。
一个问题是我里面也有一个字符,另一个问题是我需要它尽可能快。 假设我定义了以下变量:
std::string defaultName = "default";
std::string paramFullName = "Elasticity";
std::string paramName = defaultName + "_" + paramFullName[0] + "_";
此代码无法使用英特尔 C++14 编译器进行编译。
std:string paramName;
paramName += defaultName + "_";
paramName += paramFullName[0];
paramName += "_";
这次输出如预期的那样:
“默认_E_”
我仍然想测试另一种方式:
std:string paramName;
paramName.append(defaultName + "_");
paramName.append(1, paramFullName[0]);
paramName.append("_");
输出再次正常,因为char
与string
s 分离。
“默认_E_”
在测试时间时,我发现append
选项比+=
更快。
我想知道是否有更好,更有效的方法,
我也可以尽量减少行数,使它看起来不那么难看吗?
最快的方法很可能涉及分配一次目标字符串,这意味着您需要知道所有输入字符串的大小。 幸运的是std::string
,字符串文字和单个字符的大小为 O(1),因此只有 c 样式的字符串需要循环两次。
namespace string_builder
{
std::size_t length(char str)
{
return 1;
};
void append(std::string & dest, char str)
{
dest.push_back(str);
}
std::size_t length(const char * str)
{
return std::strlen(str);
};
void append(std::string & dest, const char * str)
{
dest.append(str);
}
template<std::size_t N>
std::size_t length(const char (&str)[N])
{
return N;
}
template<std::size_t N>
void append(std::string & dest, const char (&str)[N])
{
dest.append(str, N);
}
std::size_t length(const std::string & str)
{
return str.size();
}
void append(std::string & dest, const std::string & str)
{
dest.append(str);
}
}
template<typename... Ts>
std::string concat(const Ts &... ts)
{
std::string result;
result.reserve((string_builder::length(ts) + ...));
(string_builder::append(result, ts), ...);
return result;
}
使用“内置”C++“stringbuilder”:
#include <iostream> // for std::cout
#include <sstream> // for std::ostringstream
#include <string> // for std::string
int main()
{
std::ostringstream oss;
std::string s("Two");
oss << "One" << ' ' << s << ' ' << "Three";
std::string result(oss.str()); // concat result
std::cout << result; // Console Output: One Two Three
}
或(更简洁,不使用结果变量)
std::cout << oss.str();
使用 ostringstream 对象,您还可以连接任何类型的变量,前提是它们都是“可流式的”(标准流或类型本身知道如何序列化您在 operator << 之后发送的内容):
std::ostringstream oss;
int one = 1;
std::string s("Two");
oss << one << ' ' << s << ' ' << 3;
std::string result(oss.str()); // concat result
std::cout << result; // Output: 1 Two 3
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.