有没有办法在C ++中实现类似Python的\'separator\'.join?

问题描述

| 我发现的只是
boost::algorithm::string::join
。但是,仅将Boost用于联接似乎有点过头了。所以也许有一些经过时间考验的食谱? 更新: 抱歉,问题标题不好。 我正在寻找一种使用分隔符连接字符串的方法,而不仅仅是一种接一个方法。     

解决方法

由于您正在寻找食谱,因此请继续使用Boost的食谱。一旦克服了所有通用性,它就不会太复杂: 分配存储结果的地方。 将序列的第一个元素添加到结果中。 当还有其他元素时,将分隔符和下一个元素附加到结果中。 返回结果。 这是可在两个迭代器上使用的版本(与在范围上运行的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();
}
    ,如果您确实想要
\'\'.join()
,可以将
std::copy
与an4ѭ一起使用到a5ѭ。
#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));
这会将所有值插入
buffer
。您还可以为
std::ostream_iterator
指定一个自定义分隔符,但是它将在末尾附加(这是与
join
的显着区别)。如果您不希望使用分隔符,那么它将按照您想要的做。     ,简单地...:
std::string s = std::accumulate(v.begin()+1,v.end(),std::to_string(v[0]),[](const std::string& a,int b){
                           return a + \",\" + std::to_string(b);
                     });
    ```


    ,如果在项目中使用Qt,则可以直接使用QString的
join
函数(QString参考),它可以按预期从python运行。一些例子:
QStringList strList;
qDebug() << strList.join(\" and \");
结果:
\"\"
strList << \"id = 1\";
qDebug() << strList.join(\" and \");
结果:
\"id = 1\"
strList << \"name = me\";
qDebug() << strList.join(\" and \");
结果:
\"id = 1 and name = me\"
    ,这是我觉得更方便使用的另一个版本:
std::string join(std::initializer_list<std::string> initList,const std::string& separator = \"\\\\\")
{
    std::string s;
    for(const auto& i : initList)
    {
        if(s.empty())
        {
            s = i;
        }
        else
        {
            s += separator + i;
        }
    }

    return s;
}
然后可以这样称呼它:
join({\"C:\",\"Program Files\",\"...\"});
    ,C ++字符串有效实现。
std::string s = s1 + s2 + s3;
这可能会更快:
std::string str;
str.reserve(total_size_to_concat);

for (std::size_t i = 0; i < s.length(); i++)
{
  str.append(s[i],s[i].length());
}
但这基本上是您的编译器使用
operator+
所做的事情,并且除了猜测保留的大小外,还进行了最小程度的优化。 不要害羞。看一看字符串的实现。 :)     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...