STL链表问题

时间:2016-05-05 03:25:29

标签: c++

我的逻辑在我的代码中似乎是错误的。规则规定,对于3个或更多字母单词末尾的每个“e”,必须删除“e”。因此,例如“删除”将更改为“删除”或另一个示例“轻松”将更改为“eas”。我尝试使用myList.size -1,但我收到了编译错误。有人可以帮忙吗?

为方便起见,我会记下错误点。

#include <iostream>
#include <list>
#include <ctype.h>
#include <fstream>

using namespace std;

void printList(const list<char> &myList);
void fillList(list<char> &myList);
void change(list <char> &myList);

void printList(const list<char> &myList)
{
    list<char>::const_iterator itr;
    for (itr = myList.begin(); itr != myList.end(); itr++ )
    {
        cout <<*itr;
    }
    cout << '\n' << endl;
}

void fillList(list<char> &myList)
{
    ifstream file("test.txt");
    string print;
    while(file >> print)
    {
        for (int i = 0; i<=print.length(); i++)
        {
            myList.push_back(print[i]);
        }
        myList.push_back(' ');
    }
}

void change(list <char> &myList)
{
    list<char>::iterator itr;

    //rules are as follows

    //change w with v
    for (itr = myList.begin(); itr != myList.end(); itr++ )
    {
        if (*itr == 'w')
        {
            *itr = 'v';
        }

    }

    //remove e at the end of a 3+ letter word
    //PROBLEM HERE
    for (itr = myList.begin(); itr != myList.end(); itr++ )
    {
        std::list<char>::iterator itr2 = myList.size() - 1;
        if(myList.size() > 3 && itr2 == 'e')
        {
            myList.erase(itr2);
        }
    }
}

int main ()
{
    list<char> myList;
    ifstream file("test.txt");
    const string print;
    fillList(myList);
    printList(myList);
    change(myList);
    printList(myList);

    return 0;
}

1 个答案:

答案 0 :(得分:2)

您正在使用以下逻辑删除for(Object i : set) if(i.equals(1)) { set.remove(i); set.add(1337); break; } s。

e

该行

for (itr = myList.begin(); itr != myList.end(); itr++ )
{
    std::list<char>::iterator itr2 = myList.size() - 1;
    if(myList.size() > 3 && itr2 == 'e')
    {
        myList.erase(itr2);
    }
}

导致编译器错误,因为赋值运算符的RHS属于 std::list<char>::iterator itr2 = myList.size() - 1; 类型。您无法使用size_t初始化size_t类型的对象。

更重要的是,你似乎没有清楚地思考逻辑。

要从列表中删除项目,必须满足三个条件。

  1. 该项目为std::list<char>::iterator
  2. 该项目是单词的最后一个字母。
  3. 该字必须为3或更长。
  4. 第一项检查很简单。

    e

    第二次检查有点复杂。

    if ( *itr == 'e' )
    

    第三项检查比前两项检查要复杂得多。由于您的列表在下一个单词开始之前嵌入了空字符后跟空格字符,因此您需要保留字长的计数器并在看到空格字符时重置它。

    这是实现上述逻辑的代码块:

    auto next = std::next(itr);
    if ( *next == '\0' )
    

    其中int wordLength = 1; // Don't use ++iter in the last clause of the for statement. // iter is incremented only when the item is not removed. // It is updated differently when the item is removed. for (itr = myList.begin(); itr != myList.end(); ) { if ( needToRemove(itr, wordLength) ) { // Remove the item. itr = myList.erase(itr); } else { ++itr; ++wordLength; } if ( *itr == ' ' ) { // Reset word length. The next character is // going to be the start of the next word. wordLength = 0; } } 定义为:

    needToRemove