簡體   English   中英

如何在C++中重復一個字符串可變次數?

[英]How to repeat a string a variable number of times in C++?

我想在 C++ 中的字符串開頭插入 'n' 個空格(或任何字符串)。 有沒有使用 std::strings 或 char* 字符串的直接方法?

例如在 Python 中你可以簡單地做

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

在重復單個字符的特殊情況下,您可以使用std::string(size_type count, CharT ch)

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

注意。 這不能用於重復多字符串。

在 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 次更有效。

使用 string::insert 的一種形式:

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

這將在字符串的開頭(位置 0)插入“.....”(五個點)。

我知道這是一個老問題,但我希望做同樣的事情,並找到了我認為更簡單的解決方案。 似乎 cout 在 cout.fill() 中內置了此功能,請參閱“完整”解釋的鏈接

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

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

產出

.....lolcat

對於 OP std::string 的構造函數提供的示例而言,就足夠了: 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;
}

正如 Commodore 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 次”解決方案快2 倍左右

您應該編寫自己的流操縱器

cout << multi(5) << "whatever" << "lolcat";

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();
 }

這是字符串“abc” repeated 3 次的示例:

#include <iostream>
#include <sstream>
#include <algorithm>
#include <string>
#include <iterator>

using namespace std;

int main() {
    ostringstream repeated;
    fill_n(ostream_iterator<string>(repeated), 3, string("abc"));
    cout << "repeated: " << repeated.str() << endl;  // repeated: abcabcabc
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM