有没有办法在C++中实现Python的'separator'.join()模拟?

Kir*_*ill 16 c++ algorithm

我发现的只是boost::algorithm::string::join.但是,将Boost仅用于加入似乎有点过分.那么也许有一些经过时间考验的食谱?

更新:
对不起,问题标题很糟糕.我正在寻找使用分隔符连接字符串的方法,而不仅仅是逐个连接.

Rob*_*edy 13

由于您正在寻找食谱,请继续使用Boost中的食谱.一旦你超越了所有的通用性,它就不会太复杂:

  1. 分配一个存储结果的地方.
  2. 将序列的第一个元素添加到结果中.
  3. 虽然还有其他元素,但请将分隔符和下一个元素附加到结果中.
  4. 返回结果.

这是一个适用于两个迭代器的版本(与Boost版本相反,它在一个范围上运行.

template <typename Iter>
std::string join(Iter begin, Iter end, std::string const& separator)
{
  std::ostringstream result;
  if (begin != end)
    result << *begin++;
  while (begin != end)
    result << separator << *begin++;
  return result.str();
}
Run Code Online (Sandbox Code Playgroud)


Bjö*_*lex 12

如果你真的想要''.join(),你可以使用std::copya std::ostream_iteratorto a std::stringstream.

#include <algorithm> // for std::copy
#include <iterator>  // for std::ostream_iterator

std::vector<int> values(); // initialize these
std::stringstream buffer;
std::copy(values.begin(), values.end(), std::ostream_iterator<int>(buffer));
Run Code Online (Sandbox Code Playgroud)

这将插入所有值buffer.您也可以指定一个自定义分隔符,std::ostream_iterator但最后会附加(这是重要的区别join).如果你不想要一个分隔符,这将完成你想要的.


小智 8

简单地说,容器中的类型是一个int:

std::string s = std::accumulate(++v.begin(), v.end(), std::to_string(v[0]),
                     [](const std::string& a, int b){
                           return a + ", " + std::to_string(b);
                     });
Run Code Online (Sandbox Code Playgroud)