问题描述
|
我发现的只是
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+
所做的事情,并且除了猜测保留的大小外,还进行了最小程度的优化。
不要害羞。看一看字符串的实现。 :)