parallel101 / course

高性能并行编程与优化 - 课件
https://space.bilibili.com/263032155
Other
3.62k stars 532 forks source link

std::string 使用迭代器,删除\r的时候,没办法删除干净 #12

Closed qd1308504206 closed 2 years ago

qd1308504206 commented 2 years ago
    std::string src = "\r\nabc\r\r\r\r\r\r\r\r123456\nABCDEF\r\n\r\n\r\r\r\r";
    std::remove_if(src.begin(), src.end(), [](char c) {
        return c == '\r';
    });

    auto size = src.size();

    //我认为应该是 \nabc123456\nABCDEF\n\n
    //实际却是:src = "\nabc123456\nABCDEF\n\n\nABCDEF\r\n\r\n\r\r\r\r"

最近在学习彭老师的课程,学到了 string其实也有迭代器。然后就找了一个remove_if函数试了一下。

请彭老师帮忙解答一下。这是为什么呢?

我的电脑是win10 64位, 使用的是virtual stdio 2022 preview

image

qd1308504206 commented 2 years ago

必须写成这样子,才能成功。很是疑惑 image

archibate commented 2 years ago

remove_if用法错误,正确写法是: src.erase(remove_if(src.begin(), src.end(), functor), src.end()); 或者用cpp20的std::erase_if: erase_if(src, functor);

无法顺畅的大口呼吸,是活着的最好证明

---原始邮件--- 发件人: @.> 发送时间: 2022年7月20日(周三) 中午12:14 收件人: @.>; 抄送: @.***>; 主题: [parallel101/course] std::string 使用迭代器,删除\r的时候,没办法删除干净 (Issue #12)

std::string src = "\r\nabc\r\r\r\r\r\r\r\r123456\nABCDEF\r\n\r\n\r\r\r\r"; std::remove_if(src.begin(), src.end(), [](const char& c) { return c == '\r'; }); //我认为应该是 \nabc123456\nABCDEF\n\n //实际却是:src = "\nabc123456\nABCDEF\n\n\nABCDEF\r\n\r\n\r\r\r\r"

最近在学习彭老师的课程,学到了 string其实也有迭代器。然后就找了一个remove_if函数试了一下。

请彭老师帮忙解答一下。这是为什么呢?

我的电脑是win10 64位, 使用的是virtual stdio 2022 preview

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you are subscribed to this thread.Message ID: @.***>

archibate commented 2 years ago

remove_if并不会缩短string的长度,他只会把没有删除的元素“移动”到靠头的位置,剩余的元素仍然存在,需要用erase或resize调整大小才能真正删除。

无法顺畅的大口呼吸,是活着的最好证明

---原始邮件--- 发件人: @.> 发送时间: 2022年7月20日(周三) 中午12:14 收件人: @.>; 抄送: @.***>; 主题: [parallel101/course] std::string 使用迭代器,删除\r的时候,没办法删除干净 (Issue #12)

std::string src = "\r\nabc\r\r\r\r\r\r\r\r123456\nABCDEF\r\n\r\n\r\r\r\r"; std::remove_if(src.begin(), src.end(), [](const char& c) { return c == '\r'; }); //我认为应该是 \nabc123456\nABCDEF\n\n //实际却是:src = "\nabc123456\nABCDEF\n\n\nABCDEF\r\n\r\n\r\r\r\r"

最近在学习彭老师的课程,学到了 string其实也有迭代器。然后就找了一个remove_if函数试了一下。

请彭老师帮忙解答一下。这是为什么呢?

我的电脑是win10 64位, 使用的是virtual stdio 2022 preview

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you are subscribed to this thread.Message ID: @.***>

qd1308504206 commented 2 years ago

感谢大佬解答

看了教程https://en.cppreference.com/w/cpp/algorithm/remove 之后,才恍然大悟。 image