我们每天都遇到很多情况,我们必须在代码中执行繁琐且非常多的字符串操作.我们都知道字符串操作是昂贵的操作.我想知道哪些是最便宜的版本.
最常见的操作是连接(这是我们可以在某种程度上控制的).在C++中连接std :: strings的最佳方法是什么,以及加速连接的各种解决方法?
我的意思是,
std::string l_czTempStr;
1).l_czTempStr = "Test data1" + "Test data2" + "Test data3";
2). l_czTempStr = "Test data1";
l_czTempStr += "Test data2";
l_czTempStr += "Test data3";
3). using << operator
4). using append()
Run Code Online (Sandbox Code Playgroud)
另外,我们是否可以使用CString而不是std :: string?
可变参数模板在c ++ 11中引入.我发现可以使用它替换printf函数.但是,cout用于实现.我想知道是否有可能使用其他东西来实现类型安全但不牺牲太多性能.
void safe_printf(const char *s)
{
while (*s) {
if (*s == '%') {
if (*(s + 1) == '%') {
++s;
}
else {
throw "invalid format string: missing arguments";
}
}
std::cout << *s++;
}
}
template<typename T, typename... Args>
void safe_printf(const char *s, T& value, Args... args)
{
while (*s) {
if (*s == '%') {
if (*(s + 1) == '%') {
++s;
}
else {
std::cout << value;
safe_printf(s + 1, args...); // …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种快速而简洁的方式来打印一个漂亮的表格格式,正确对齐单元格.
在c ++中是否有一种方便的方法来创建具有一定长度的子串的字符串,如python格式
"{:10}".format("some_string")
Run Code Online (Sandbox Code Playgroud) 我javascript可以使用格式化字符串template string
const cnt = 12;
console.log(`Total count: ${cnt}`);
Run Code Online (Sandbox Code Playgroud)
如果我与我一起工作,python我可以使用f-string:
age = 4 * 10
f'My age is {age}'
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用C++(17)什么是最好的解决方案(如果可能的话)?
这对我来说有点冗长:
ostrstream ss;
ss << "Selected elements: " << i << "," << j << ".";
string msg(ss.str(), (size_t)ss.pcount());
Run Code Online (Sandbox Code Playgroud)
是否有一种优雅的方法来使用简洁的单行语句(可能带有模板或宏)来格式化文本消息?
我习惯于在 c# 或 JavaScript 中像这样的字符串插值的易于阅读的语法,所以当我开始学习 c++ 时,我期望它会有类似的功能,但是在 c++ 中搜索字符串插值时我找不到类似的东西。
在 c# 中,字符串是这样插入的:
$"My variable has value {myVariable}"
Run Code Online (Sandbox Code Playgroud)
在 JavaScript 中,它看起来像这样:
`My variable has value ${myVariable}`
Run Code Online (Sandbox Code Playgroud)
在字符串文字的不同位置插入多个值是一个常见问题,我确信在 C++ 中有一些标准方法可以做到这一点。我想知道在 C++ 中最简单的方法是什么,人们通常是怎么做的。
是否有一个通用的函数可以做sprintf类型字符串格式化而不必提供固定大小的缓冲区,它返回一个string类实例?
我知道stringstream它没有做我想做的事情,我不想在输出语句中硬编码令牌的位置,就像它需要的那样.
我希望能够定义一个类似于sprintf让你的模式,但是没有C行李和更加惯用的面向对象的C++方式.
也许某些函数可以执行sprintf使用a stringstream并生成string对象的功能?在String中使用String.format()或Python中等效的String格式化语法的便利性.
来自python,我对C++有些新意.我真正想念的一个功能是字符串格式操作符.我已经看到很多可以在printf()函数中使用的例子,但是,有时候只是在字符串变量中替换占位符是很方便的.以下是使用mysqldb模块的python示例:
...
stmt = 'INSERT INTO %s(pid, starttime) VALUES("%s","%s")' % ('pids', int(p0.pid), episode[0][1])
cursor.execute(stmt)
Run Code Online (Sandbox Code Playgroud)
你能用C++做类似的事吗?我没有找到任何谷歌搜索的例子.
我正在将其他人的C++库转换为在GCC(Xcode)下工作.字符串格式化的基本方法是什么?
编辑:我看到我的问题的原始措辞引起了很多混乱,更不用说一些娱乐.我需要做的是替换其库中的某些字符串格式化函数.他们已经通过wxString进行了格式化,我不希望将其包含在我的项目中 - 我知道它是针对Xcode的,但对于我需要做的简单格式化,这似乎是一种大锤类型的方法.它们具有接受对象并吐出字符串的函数 - 通常是(char*),我需要创建相同的(char*)输出[然后可能会转到库中的另一个对象; 不一定是用户],但是以不使用wxString的方式进行.我宁愿避免把它变成C++.在Objective-C中,我一直使用NSString的stringWithFormat:方法执行此操作.显然我不想使用任何NSString方法,也不想创建NSStrings.创建(char*)或C++字符串就可以了.不,这不是虚假的事实,也不是功课.