如何在C ++中重复一个string可变的次数?

我想在C ++的string开头插入'n'个空格(或任何string)。 是否有任何直接的方式来使用std :: strings或char *string?

例如在Python中,你可以简单地做

>>> "." * 5 + "lolcat" '.....lolcat' 
 std::string foo = std::string(5, '.') + "lolcat"; 

检查出std :: string的构造函数 。

没有直接的惯用方法来重复C ++中的string,相当于Python中的*运算符或Perl中的x运算符。 如果你重复一个单一的字符,那么这个双参数的构造函数(正如前面的答案所build议的)工作得很好:

 std::string(5, '.') 

这是你如何使用ostringstream重复一个stringn的一个人为的例子:

 #include <sstream> std::string repeat(int n) { std::ostringstream os; for(int i = 0; i < n; i++) os << "repeat"; return os.str(); } 

取决于实现,这可能比简单地将串连接n次更有效。

使用string :: insert的forms之一:

 std::string str("lolcat"); str.insert(0, 5, '.'); 

这将在string的开头(位置0)插入“…..”(五个点)。

我知道这是一个古老的问题,但我期望做同样的事情,并已经find了我认为是一个更简单的解决scheme。 看来,cout有这个函数内置cout.fill(),看到一个“完整”的解释的链接

http://www.java-samples.com/showtutorial.php?tutorialid=458

 cout.width(11); cout.fill('.'); cout << "lolcat" << endl; 

输出

 .....lolcat 

你应该写你自己的stream操纵器

cout << multi(5)<<“whatever”<<“lolcat”;

正如杰克所说的那样,我不认为其他答案实际上回答了这个问题。 问题是如何重复一个string,而不是一个字符。

虽然Commodore给出的答案是正确的,但是效率很低。 这是一个更快的实现,其思想是通过首先指数增长string来最小化复制操作和内存分配:

 #include <string> #include <cstddef> std::string repeat(std::string str, const std::size_t n) { if (n == 0) { str.clear(); str.shrink_to_fit(); return str; } else if (n == 1 || str.empty()) { return str; } const auto period = str.size(); if (period == 1) { str.append(n - 1, str.front()); return str; } str.reserve(period * n); std::size_t m {2}; for (; m < n; m *= 2) str += str; str.append(str.c_str(), (n - (m / 2)) * period); return str; } 

我们也可以定义一个operator*来获得更接近Python版本的东西:

 #include <utility> std::string operator*(std::string str, std::size_t n) { return repeat(std::move(str), n); } 

在我的机器上,这比Commodore的执行速度快了10倍,比天真的“附加n – 1次”解决scheme快了约2