我的逻辑在我的代码中似乎是错误的。规则规定,对于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;
}
答案 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
类型的对象。
更重要的是,你似乎没有清楚地思考逻辑。
要从列表中删除项目,必须满足三个条件。
std::list<char>::iterator
。第一项检查很简单。
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