0

我正在寻找与此代码等效的标准库,用于将 std 容器的元素累积到一个字符串中,并用分隔符分隔连续的条目:

string accumulate_with_delimiter( vector<string> strvect, string delimiter )
{
    string answer;
    for( vector<string>::const_iterator it = strvect.begin(); it != strvect.end(); ++it ) 
    {
        answer += *it;
        if( it + 1 != strvect.end() ) 
        {
            answer += delimiter;
        } 
    }
    return answer;
} 

这样的代码似乎很常见:用分隔符“”打印出一个数组,或者用分隔符“,”保存到一个 CSV 文件中,等等。因此,很可能这样的一段代码进入了标准库。std::accumulate 接近,但没有分隔符。

4

3 回答 3

1

std::accumulate可能是正确的答案,但您需要使用自定义加法器的版本。然后,您可以提供自己的 lambda。

请记住front()作为第一个要累积的值传递,然后从 开始添加begin() + 1。当然首先测试空向量。

于 2013-10-28T23:03:34.593 回答
1

我认为标准 C++ 库没有很好的分隔序列的方法。我通常最终会使用类似的东西

std::ostringstream out;
if (!container.empty()) {
    auto end(container.end());
    std::copy(container.begin(), --end, std::ostream_iterator<T>(out, ", "));
    out << *end;
}

Usingstd::accumulate()有一个类似的问题,虽然是第一个元素而不是最后一个元素。使用自定义添加函数,您可以像这样使用它:

std::string concat;
if (!container.empty()) {
    auto begin(container.begin());
    concat = std::accumulate(++begin, container.end(), container.front(),
        [](std::string f, std::string s) { return f + ", " + s; });
}

在这两种情况下,迭代器都需要移动到另一个元素。代码在移动迭代器时使用临时对象,因为container可能使用指针作为迭代器,在这种情况下,结果的预递增或预递减begin()end()不起作用。

于 2013-10-28T23:10:16.810 回答
0

我不确定最近的标准库中是否有一个,但总是有boost::algorithm::join(strvec, delimiter).

于 2013-10-28T23:07:39.100 回答