Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在字符串C+中的字符之间添加空格+; < >我在C++中找到字符串中每个字符之间添加空间 >“代码> >的最有效方法。_C++_Performance_C++11 - Fatal编程技术网

在字符串C+中的字符之间添加空格+; < >我在C++中找到字符串中每个字符之间添加空间 >“代码> >的最有效方法。

在字符串C+中的字符之间添加空格+; < >我在C++中找到字符串中每个字符之间添加空间 >“代码> >的最有效方法。,c++,performance,c++11,C++,Performance,C++11,假设我传递了一个字符串“123”,我想得到“123”或“123”(这并不重要) 有人知道做这种事最快的方法吗 到目前为止,我的方法是这样的 string output; for(int i = 0 ; i < s.length(); ++i) { output += s.substr(i, 1) + " "; } return output; 字符串输出; 对于(int i=0;i

假设我传递了一个字符串
“123”
,我想得到
“123”
“123”
(这并不重要)

有人知道做这种事最快的方法吗

到目前为止,我的方法是这样的

    string output;
    for(int i = 0 ; i < s.length(); ++i) {
        output += s.substr(i, 1) + " ";
    }
    return output;
字符串输出;
对于(int i=0;i
…但我只是想知道是否有更好的方法


谢谢

您可以使用range-v3库方便地编写此文档。因此:

namespace rs = ranges;
namespace rv = ranges::views;

std::string input = "123";
如果只想打印带有空格的字符串,可以执行以下操作:

rs::copy(input | rv::intersperse(' '), 
         rs::ostream_iterator<char>(std::cout));
auto result = input | rv::intersperse(' ') | rs::to<std::string>;
rs::复制(输入| rv::散布(“”),
rs::ostream_迭代器(std::cout));
如果要将结果存储在新字符串中,可以执行以下操作:

rs::copy(input | rv::intersperse(' '), 
         rs::ostream_iterator<char>(std::cout));
auto result = input | rv::intersperse(' ') | rs::to<std::string>;
auto result=input | rv::intersperse('')| rs::to;
这是一个例子


我认为这是合理的效率,但更重要的是,它的可读性非常好。

代码的低效之处在于重复重新分配字符串

您预先知道
输出的大小,所以您应该分配它,并用空格填充。然后,您只需将所有角色置于其新位置:

std::string foo(const std::string& s) {
  std::string output(s.length()*2-1, ' ');
  for (int i = 0, j = 0; i < s.length(); ++i, j+=2) {
    output[j] = s[i];
  }
  return output;
}
std::string foo(const std::string&s){
字符串输出(s.length()*2-1',);
对于(int i=0,j=0;i
你知道一种缓慢的方法吗?请展示它,然后也许我们可以让你相信它足够快(或者告诉你如何让它更快)你想创建一个新字符串,还是仅仅打印它?我更新了帖子,以便你可以看到我现在使用的方法。我想生成它们并将它们存储在向量中,而不是打印它们,以显示代码的帮助,但是“高效”是什么意思?我已经展示了如何方便地完成这项工作,但是如果这是一个性能问题,那么您需要提供更多关于您运行的基准的信息,以及为什么您认为您的解决方案可以改进由于编译器优化,所有这些方法都应该提供相同的效率。你也可以用
来表示范围
循环,或者经常被嘲笑的“根本不做”。人们常常忘记,做某事最快的方法就是不去做。如果添加的空格仅在打印字符串时出现在屏幕上,则无需分配两倍于原始字符串大小的字符串。或者编写一个迭代器,每秒对一个
进行反限制也不太困难。@idclev463035818 True,也添加了该选项,谢谢。range-v3声称支持C++14/17/20,OP标记为C++11。但它看起来真的很酷!这就是我们在C++20中得到的,还是range-v3比C++20中得到的更加成熟?让我想起了C#LINQ(C#LINQ让我想起了F#)。@Eljay啊,说得好,我没有看到C++11标记。没错,range-v3至少需要C++14来编译(至少对于演示中的组件)。C++20 ranges深受range-v3的启发,但它只有一小部分。我们将在C++23中获得更多内容,之后还会有更多内容:)