C++使用STL遇到的问题
阿神
阿神 2017-04-17 13:02:06
0
3
582

目的:去掉std::deque中不符合条件的元素,在下面的代码中,是把大写转成小写,把其他符号去掉。

#include "iostream"
#include "deque"
using namespace std;

int main ()
{
    deque<char> string;
    char ch;
    while((ch = getchar()) != EOF)
        string.push_back(ch);
    
    for (deque<char>::iterator it = string.begin(); it != string.end(); ++it)
    {
        if ('a' <= *it && *it <= 'z')
            continue;
        else if ('A' <= *it && *it <= 'Z')
            *it = tolower(*it);
        else
            string.erase(it);
    }
    
    while (!string.empty())
    {
        cout << string.front();
        string.pop_front();
    }
}

输入:

das ;ds;a ;das; d;as
d;as ;das; ;das

输出:

dasdsadasdasdas;das das

请教下一为何会漏掉某些字符?

阿神
阿神

闭关修行中......

全部回覆(3)
Peter_Zhu

迭代器失效,移除容器裡不匹配的元素可以先remove_if移動到容器最後然後再調用容器自身的erase批量刪除

  using namespace std;

  deque<char> in;
  transform(istream_iterator<char>(cin), istream_iterator<char>(), back_inserter(in), tolower);
  in.erase(remove_if(begin(in), end(in), not1(ptr_fun(isalpha))), end(in));
  copy(begin(in), end(in), ostream_iterator<char>(cout));

如果不需要真正的刪除,可以這樣

  using namespace std;

  deque<char> in;
  transform(istream_iterator<char>(cin), istream_iterator<char>(), back_inserter(in), tolower);
  copy(begin(in), remove_if(begin(in), end(in), not1(ptr_fun(isalpha))), ostream_iterator<char>(cout));

remove_if、remove回傳值是可以刪除的元素起始位置

Ty80

我來跟你解釋一下,在兩個號碼的地方,假如現在it指向第一個; 那麼它符合刪除的條件 erase(it) 。此時it++,但此時it不再指向第二個; 而是後面的d。因為當你erase(it)時,it後的指標都會前移it已經指向第二個; 你在it++怎麼可能還指向第二個; 呢。 你在空格分號連用的地方也是因為這個。所以你的程式本身就是錯誤的,因為它並不會檢查每一個字符,每次你erase(it)操作後,其後面的字符不管合不合法都不會進行檢查。正確的寫法,可以參考如下(僅作為參考依據):

deque<char>::iterator it = string.begin();
while(it!= string.end() )
{
     if ('a' <= *it && *it <= 'z')
        continue;
    else if ('A' <= *it && *it <= 'Z')
        *it = tolower(*it);
    else 
    {
        string.erase(it);
        continue;
    }
    it++;    
}
左手右手慢动作

呼叫erase函數後,原來的迭代器it失效,對其的++操作不可預期。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!