【问题标题】:c++ combine erase and remove string [duplicate]c ++结合擦除和删除字符串[重复]
【发布时间】:2014-06-04 12:31:36
【问题描述】:

我看到有人使用此行从存储在向量中的字符串中删除空格,但我无法理解使用擦除和删除这种方式的原因? 第二个问题:我怎样才能不只删除空格,而是删除任何不是 'num' 或 '-' 的东西?

这不是完整的代码,它只是一个sn -p,不会编译。该向量仅包含文本文件的原始字符串,字符串以逗号分隔,当前字符串可以包含除逗号之外的任何可能的字符。

vector <string> vecS;
ifstream vecStream;
while(vecStream.good()) {
 vecS.resize(i+1);
 getline(vecStream, vecS.at(i), ',');
 vector <string> vecS;          
 vecS.at(i).erase(remove( vecS.at(i).begin(), vecS.at(i).end(), ' '), vecS.at(i).end());
 i++
}

编辑;添加了更多代码,希望现在更清楚

【问题讨论】:

  • 您知道可以将代码格式化为代码吗?当你编辑你的问题时,寻找橙色?它会给你一些帮助(你也可以将鼠标悬停在其他按钮上)。
  • 请发布真实代码。当前代码不会编译。假设代码猜测作为灵感的真实代码的基本原理,就变成了……猜谜游戏。
  • @Samuel 是的,我编辑了我的问题并丢失了代码格式,你比我修复它的速度更快
  • 我很困惑:两个 vecSs 都是空的。
  • 每个问题一个问题。这不是聊天室。

标签: c++ string


【解决方案1】:

但我不明白使用擦除的原因并将其删除 怎么办?

std::remove 基本上是重新排列序列,以便 不 被删除的元素全部转移到序列的开头 - 该部分的结束迭代器,并且有效然后返回序列的新结尾。

虽然在那个 sn-p 中绝对不需要文件流:

vector <string> vecS;
// Do something with vecS

for( auto& s : vecS )   
    s.erase( remove_if( std::begin(s), std::end(s), 
                        [](char c){ return std::isspace(c); }), // Use isspace instead, that recognizes all white spaces
             std::end(s) );

【讨论】:

  • 谢谢 :) 如何扩展它以删除不是数字或“-”的所有内容?
  • @Molegrammer 在 lambda 中,不要只使用 isspace,而是添加适当的条件。
  • @Molegrammer 所以条件是!std::isdigit(c) &amp;&amp; c != '-'
  • 这也会删除空格吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-30
  • 1970-01-01
  • 2018-03-28
  • 2021-07-02
  • 1970-01-01
  • 2020-12-24
  • 1970-01-01
相关资源
最近更新 更多