fork download
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. template <typename RAI>
  5. std::string string_join(RAI begin, RAI end, std::string delimiter) {
  6. if (begin == end) { return ""; }
  7. std::string joint = std::to_string(*begin);
  8. ++begin;
  9. for (; begin != end; begin++) {
  10. joint += delimiter + std::to_string(*begin);
  11. }
  12. return joint;
  13. }
  14.  
  15. template <int depth>
  16. struct string_join_recursive {
  17. template <typename RAI>
  18. std::string operator()(RAI iterator, RAI end, const std::string *delimiters) const {
  19. if (iterator == end) { return ""; }
  20. std::string joint = string_join_recursive<depth-1>()(std::begin(*iterator), std::end(*iterator), delimiters+1);
  21. for (++iterator; iterator != end; ++iterator) {
  22. joint += *delimiters + string_join_recursive<depth-1>()(std::begin(*iterator), std::end(*iterator), delimiters+1);
  23. }
  24. return joint;
  25. }
  26. };
  27.  
  28. template <>
  29. struct string_join_recursive<1> {
  30. template <typename RAI>
  31. std::string operator()(RAI iterator, RAI end, const std::string *delimiters) const {
  32. return string_join(iterator, end, *delimiters);
  33. }
  34. };
  35.  
  36. int main() {
  37. const std::vector<std::vector<std::vector<int>>> v = {{{1, 2, 3}, {4, 5, 6}}, {{7, 8}, {}, {9, 10, 11}}};
  38. const std::string delimiters[3] = {"\n", ";", ","};
  39. std::cout << string_join_recursive<3>()(v.begin(), v.end(), delimiters) << std::endl;
  40. }
  41.  
Success #stdin #stdout 0s 15248KB
stdin
Standard input is empty
stdout
1,2,3;4,5,6
7,8;;9,10,11