【问题标题】:Copy a std::string using copy_if (into another string)使用 copy_if 复制 std::string (到另一个字符串中)
【发布时间】:2019-08-14 17:32:56
【问题描述】:

我想知道有选择地将字符从一个字符串复制到另一个字符串的最佳方法是什么。我有类似的东西

string buffer1("SomeUnknownwSizeAtCompileTime");
string buffer2; // WillBeAtMostSameSizeAsBuffer1ButMaybeLessAfterWeRemoveSpaces
buffer2.resize(buffer1.length());
std::copy_if(buffer1.begin(), buffer1.end(), buffer2.begin(), [](char c){
            //don't copy spaces
            return c != ' ';
});

buffer2 可能比 buffer1 小很多,但我们必须分配与 buffer1 长度相同的内存量。然而,在复制之后,buffer2 的结束迭代器将指向空终止字符。我用谷歌搜索了一下,显然这是设计使然,所以现在我想知道我不应该将 copy_if 与字符串一起使用吗?

谢谢

【问题讨论】:

    标签: c++ arrays copy stdstring


    【解决方案1】:

    您需要使用std::back_inserter

    #include <iterator>
    
    std::copy_if(buffer1.begin(), buffer1.end(), back_inserter(buffer2), [](char c){
            //don't copy spaces
            return c != ' ';
    });
    

    back_inserter(buffer2) 返回一个专门的迭代器,它追加而不是覆盖buffer2 的元素。

    要使其正常工作,您必须确保从一个空的 buffer2 开始。即不要使用:

     buffer2.resize(buffer1.length());
    

    【讨论】:

    • 感谢您的评论。我完全放弃了查看 back_inserters,因为我认为这需要一个名为 push_back 的实际方法。猜猜它可以将容器更改为容器。无论如何,关于性能,我认为我受制于 std::string 的增长。如果我期望字符串的粗略大小,当我重新插入新字符串时,我可以做任何事情来阻止数字或新分配吗?
    • String 有一个名为 push_back 的方法,否则 back_inserter 将无法工作。字符串也有一个类似于向量的保留方法,如果你用你的近似大小调用它,它将防止重新分配。
    猜你喜欢
    • 1970-01-01
    • 2017-01-26
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 2010-10-30
    相关资源
    最近更新 更多