【问题标题】:Efficiently appending or inserting a variable number of spaces to a string有效地将可变数量的空格附加或插入到字符串中
【发布时间】:2013-05-08 05:30:06
【问题描述】:

我有一个简单的程序,可以插入或附加一些空格来对齐文本。

f()
{
    string word = “This word”;
    const string space = “ “;
    int space_num = 5; // this number can vary 
    for (int i = 0; i < space_num; i++)
        {
            word.insert(0, space);
        }   
    cout << word;
}

现在这可行,但我想知道是否有更有效的方法来做到这一点。不是在优化我的程序方面,而是在标准实践方面。

我可以想象两种可能的方法:

1 - 有没有办法创建一个由 20 个空格组成的字符串,并附加这些空格的一部分,而不是重复添加一个空格。

2 – 有没有办法创建具有可变数量空格的字符串并附加它?

【问题讨论】:

    标签: c++ string insert append


    【解决方案1】:

    是的,都取多份和一个字符:

    word.insert(0, space_num, ' ');
    word.append(space_num, ' ');
    

    对于对齐文本,请记住,您可以使用字符串流和 &lt;iomanip&gt; 标头,例如 std::setw

    【讨论】:

    • 您和 taocp 的回答都很棒。我认为这个答案提供了更多关于对齐信息以及非常清晰和简洁的信息。在授予最佳答案之前,我将进行效率测试(如果可以的话),看看哪个更快。感谢你们快速而明确的回答。
    • 我需要一个更好的速度测试程序,我想这是我的下一个项目。我认为这种方法出来得更快。我宁愿得到具体的结果,也不愿得到糟糕的结果。
    • @David,你确定这是你项目中所有代码中慢的部分吗?
    • 在这种情况下,我并不担心它会变慢。我只是在寻找一种更好的方法来做到这一点。我的路线似乎有点笨拙。
    【解决方案2】:

    1 - 有没有办法创建一个由 20 个空格组成的字符串,并附加这些空格的一部分,而不是重复添加一个空格。

    是的,试试这个:

     string spaces(20, ' ');
     string portionOfSpaces = spaces.substr(0,10); //first 10 spaces
     string newString = portionOfSpaces + word;
    

    一般情况下,您可以使用substr 来获取一部分空格并对该子字符串进行操作。

    2 – 有没有办法创建具有可变数量空格的字符串并附加它?

    是的,请参见字符串构造函数:string (size_t n, char c);string::append

    【讨论】:

    • 为什么要创建带有 20 个字符的 spaces 只是为了提取带有 substr 的前 10 个字符?只需首先创建您需要的空间数量!
    • @DavidRodríguez-dribeas 如果我理解正确,我会按照 OP 的要求这样做。但我同意你的观点,我们只需要创建所需数量的空间。
    • 创建 20 意味着可以重复使用相同的空格字符串来格式化多个字符串,而不是为每个字符串创建一个空格字符串。是否更快 - 我不知道。
    • @David:不是真的,因为substr 会创建字符串的副本。获取substr 与首先创建正确的字符串一样昂贵。
    猜你喜欢
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    • 2016-07-14
    • 2021-05-12
    • 2015-07-03
    • 2014-12-19
    相关资源
    最近更新 更多