c++ - 可以boost:algorithm:: join()連接一個浮點的容器?




string stl (2)

Boost連接可用於連接一個可選的由分隔符字符串分隔的字符串容器,如下例所示: boost :: algorithm :: join的一個很好的例子

我的STL技能很薄弱。 我想知道是否有任何方式使用相同的功能的數字(浮動,雙打,整數)的容器? 它似乎應該有一個或兩個班輪,以適應其他類型。

還有stl的複制功能,在這裡找到一個很好的例子: 如何打印出矢量的內容?

但我不喜歡在每個元素之後添加分隔符字符串。 我想只使用提升。


我的STL技能很薄弱。 我想知道是否有一個數字(浮點數,雙打,整數)容器使用相同的功能? 它似乎應該有一個或兩個班輪,以適應其他類型。

std::accumulate允許對任何(輸入)迭代器範圍進行折疊,使用一個二進制函數,可以為“累加器”和下一個項目採用不同的類型。 在你的情況:一個函數採取一個std::string和一個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×2×3×4×5 = 120


當然,你可以結合boost::algorithm::joinboost::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); }), ", ")




adapter