Boost join 可用于连接由分隔符字符串选择性分隔的字符串容器,如下例所示:Boost::algorithm::join 的一个很好的例子
我的 STL 技能很弱。我想知道是否有任何方法可以对数字容器(浮点数、双精度数、整数)使用相同的函数?似乎应该有一些一两个班轮来适应其他类型。
还有 stl 的复制功能,这里有一个很好的例子: 如何打印出向量的内容?
但我不喜欢它如何在每个元素之后添加分隔符字符串。我想只使用boost。
Boost join 可用于连接由分隔符字符串选择性分隔的字符串容器,如下例所示:Boost::algorithm::join 的一个很好的例子
我的 STL 技能很弱。我想知道是否有任何方法可以对数字容器(浮点数、双精度数、整数)使用相同的函数?似乎应该有一些一两个班轮来适应其他类型。
还有 stl 的复制功能,这里有一个很好的例子: 如何打印出向量的内容?
但我不喜欢它如何在每个元素之后添加分隔符字符串。我想只使用boost。
当然,您可以组合boost::algorithm::join
并将boost::adaptors::transformed
双打转换为字符串,然后将它们连接在一起。
#include <iostream>
#include <vector>
#include <string>
#include <boost/algorithm/string/join.hpp>
#include <boost/range/adaptor/transformed.hpp>
int main()
{
using boost::adaptors::transformed;
using boost::algorithm::join;
std::vector<double> v{1.1, 2.2, 3.3, 4.4};
std::cout
<< join( v |
transformed( static_cast<std::string(*)(double)>(std::to_string) ),
", " );
}
输出:
1.100000, 2.200000, 3.300000, 4.400000
您还可以使用 lambda 来避免丑陋的演员表
join(v | transformed([](double d) { return std::to_string(d); }), ", ")
我的 STL 技能很弱。我想知道是否有对数字容器(浮点数、双精度数、整数)使用相同的函数?似乎应该有一些一两线来适应其他类型。
std::accumulate
允许使用二进制函数对任何(输入)迭代器范围进行折叠,该函数可以为“累加器”和下一项采用不同的类型。在您的情况下:一个函数采用 astd::string
和 a double
(或其他)将给定std::string
的结果std::to_string
与第二个参数的结果连接起来。
template<typename Container>
std::string contents_as_string(Container const & c,
std::string const & separator) {
if (c.size() == 0) return "";
auto fold_operation = [&separator] (std::string const & accum,
auto const & item) {
return accum + separator + std::to_string(item);};
return std::accumulate(std::next(std::begin(c)), std::end(c),
std::to_string(*std::begin(c)), fold_operation);
}
如您所见,这完全独立于容器的值类型。只要你能传给std::to_string
你就好了。实际上,上面的代码是为std::accumulate
.
int main() {
std::vector<double> v(4);
std::iota(std::begin(v), std::end(v), 0.1);
std::cout << contents_as_string(v, ", ") << std::endl;
std::vector<int> w(5);
std::iota(std::begin(w), std::end(w), 1);
std::cout << contents_as_string(w, " x ") << " = "
<< std::accumulate(std::begin(w), std::end(w), 1, std::multiplies<int>{})
<< std::endl;
}
0.100000、1.100000、2.100000、3.100000
1 x 2 x 3 x 4 x 5 = 120