88856


Python だと `"ab"*3 -> "ababab"` のように書けますが、C++ではどう簡潔に書けますか？


CC BY-SA 4.0
2022-05-16T11:35:55.497
88855
2022-05-23T04:36:14.503
2022-05-17T00:08:56.330
3060
52647
question
c++
Python だと "ab"*3 -> "ababab" のように書けますが、C++ではどう書けますか？


関数を定義してみるのもよいかもしれません。

[code]

    #include <string>
    #include <iostream>
     
    std::string repeat_string(const std::string &text, int n) {
      if (n <= 0) return "";
      std::string repeated;
      repeated.reserve(n*text.length());
      for(;n;--n, repeated += text);
      return repeated;
    }
     
    int main() {
      std::cout << repeat_string("ab", 3) << std::endl;
      return 0;
    }
    
[/code]


CC BY-SA 4.0
2022-05-16T12:33:11.407
88856
2022-05-16T12:33:11.407
47127
88855
answer


サードパーティライブラリ[Range-v3](https://ericniebler.github.io/range-v3/index.html)を利用して、ワンライナー風に記述することもできはします。（技巧的なコードですし、あまりお薦めはしません...）

[code]

    #include <string>
    #include <iostream>
    // Range-v3 Library
    #include <range/v3/all.hpp>
    namespace rng = ranges; 
    
    int main() {
      std::string s = "ab";
      size_t n = 3;
    
      std::string result = rng::views::repeat_n(s, n) | rng::views::join | rng::to<std::string>();
    
      std::cout << result;
    }
    
[/code]

Demo: <https://godbolt.org/z/9Efc3fnb3>

また、2023年改定の次期C++23標準ライブラリには同等機能[`repeat(s,
n)`](https://wg21.link/p2474)や[`to<string>()`](https://wg21.link/p1206r7)が取り込まれる見込みです。

[code]

    #include <string>
    #include <iostream>
    #include <ranges>  // C++23
    namespace rng = std::ranges; 
    
    int main() {
      std::string s = "ab";
      size_t n = 3;
    
      std::string result = rng::views::repeat(s, n) | rng::views::join | rng::to<std::string>();
    
      std::cout << result;
    }
    
[/code]


CC BY-SA 4.0
2022-05-23T04:26:26.747
88989
2022-05-23T04:36:14.503
2022-05-23T04:36:14.503
49
49
88855
answer