如何在C ++中重复一次字符串变量?

时间:2008-10-03 12:43:05

标签: c++

我想在C ++中的字符串开头插入'n'个空格(或任何字符串)。有没有直接的方法来使用std :: strings或char * strings?

E.g。在Python中你可以简单地做

>>> "." * 5 + "lolcat"
'.....lolcat'

9 个答案:

答案 0 :(得分:139)

在重复单个字符的特定情况下,您可以使用std::string(size_type count, CharT ch)

std::string(5, '.') + "lolcat"

NB。这不能用于重复多字符串。

答案 1 :(得分:36)

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

std::string(5, '.')

这是一个人为的示例,说明如何使用ostringstream重复字符串n次:

#include <sstream>

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

根据实现情况,这可能比简单地连接字符串n次更有效。

答案 2 :(得分:17)

使用string :: insert:

之一的形式
std::string str("lolcat");
str.insert(0, 5, '.');

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

答案 3 :(得分:10)

我知道这是一个老问题,但我希望做同样的事情并找到我认为更简单的解决方案。似乎cout使用cout.fill()内置了这个函数,请参阅“完整”解释的链接

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

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

输出

.....lolcat

答案 4 :(得分:8)

正如Jaeger准将提到的,我不认为其他任何答案实际上都回答了这个问题;问题是如何重复字符串,而不是字符。

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

#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倍&#39; 解决方案快约2倍。

答案 5 :(得分:6)

你应该编写自己的流操纵器

  

cout&lt;&lt; multi(5)&lt;&lt; “不管”&lt;&lt;   “lolcat”;

答案 6 :(得分:2)

ITNOA

您可以使用C ++函数执行此操作。

 std::string repeat(const std::string& input, size_t num)
 {
    std::ostringstream os;
    std::fill_n(std::ostream_iterator<std::string>(os), num, input);
    return os.str();
 }

答案 7 :(得分:2)

出于OP std :: string提供的示例的目的,ctor就足够了:std::string(5, '.')。 但是,如果有人正在寻找一个多次重复std :: string的函数:

std::string repeat(const std::string& input, unsigned num)
{
    std::string ret;
    ret.reserve(input.size() * num);
    while (num--)
        ret += input;
    return ret;
}

答案 8 :(得分:0)

以下是字符串“ abc” const [connection, setConnection] = useState(null); const [counts, dispatch] = useReducer(BaskentMobilReducer, INITIAL_VALUE); useEffect(() => { const newConnection = new HubConnectionBuilder() .withUrl(`${config.API_BASE_URL}update-progress`, { transport: HttpTransportType.WebSockets, accessTokenFactory: () => { return `${localStorage.token}`; }, }) .build(); setConnection(newConnection); }, []); useEffect(() => { const fetchData = async () => { if (connection) { try { await connection.start(); connection.onclose((error) => { console.info("Connection Closed:", error); }); if (connection.state === HubConnectionState.Connected) { connection.on("UpdateProgress", (message) => { if (message.count) { setTotalCount(message.count); setTitleText( `Bildirim Gonderim Başladı, Toplam Alıcı Sayısı:${message.count}` ); } else if (message.status == 0) { debugger; dispatch({ type: "UPDATE_COUNTS_SUCCESS", }); console.log("counts", counts); } else if (message.status == 1) { debugger; dispatch({ type: "UPDATE_COUNTS_FAIL", }); console.log("counts", counts); } console.info("message", message); }); } } catch (err) { console.log(err); } } }; fetchData(); }, [connection]); 3次的示例:

repeated