您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> C/C++ >> 为list<>>定义了一个迭代器,insert和erase出错

为list<>>定义了一个迭代器,insert和erase出错

来源:网络整理     时间:2016/8/27 11:56:03     关键词:

关于网友提出的“ 为list<>>定义了一个迭代器,insert和erase出错”问题疑问,本网通过在网上对“ 为list<>>定义了一个迭代器,insert和erase出错”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 为list<>>定义了一个迭代器,insert和erase出错
描述:

迭代器调试数据

这是一个文本处理的程序(出自 《c++程序设计原理与实践》第二十章)
自定义了一个Document类,用list<>>存储数据
为Document类定义了一个“二重迭代器”
然后,我调试了三天。。。废寝忘食。。。
遇到了各种iterator报错。。。 为list<vector<char>>定义了一个迭代器,insert和erase出错
可以确定的是,在change_text使用erase和insert函数之后,迭代器会指向错误的地方
使用print()函数会出现迭代器越界(如果把自定义的end()往前移一位则不越界,但会少打印一个字符)
如若抽空一看,不胜感激。
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
inline void keep_window_open();
typedef vector Line;    // a line is a vector of characters
//------------------------------------------------------------------------------
class Text_iterator { // keep track of line and character position within a line
public:
list::iterator ln;
Line::iterator pos;
typedef forward_iterator_tag iterator_category;
typedef char value_type;
typedef size_t difference_type;
typedef char* pointer;
typedef char& reference;
// start the iterator at line ll's character position pp:
Text_iterator(list::iterator ll, Line::iterator pp)
:ln(ll), pos(pp) { }
char& operator*() { return *pos; }
Text_iterator& operator++();
bool operator==(const Text_iterator& other) const;
bool operator!=(const Text_iterator& other) const { return !(*this == other); }
};
//------------------------------------------------------------------------------
Text_iterator& Text_iterator::operator++()
{
++pos;                // proceed to next character
if (pos == (*ln).end()) {
++ln;            // proceed to next line
pos = (*ln).begin();
}
return *this;
}
//------------------------------------------------------------------------------
bool Text_iterator::operator==(const Text_iterator& other) const
{
return ln == other.ln && pos == other.pos;
}
//------------------------------------------------------------------------------
struct Document {
list line;
Document() { line.push_back(Line()); }
class Error{};
Text_iterator begin()      // first character of first line
{
return Text_iterator(line.begin(), line.begin()->begin());
}
Text_iterator end()        // one beyond the last line
{
list::iterator last = line.end();
return Text_iterator(last, last->end());
}
};
istream& operator>>(istream& is, Document& d){
char ch;
while (is.get(ch)){
d.line.back().push_back(ch);
if (ch == '\n')
d.line.push_back(Line());
}
return is;
}
//------------------------------------------------------------------------------
void print(Document& d)
{
for (Text_iterator p = d.begin(); p != d.end(); ++p) cout << *p;
}
//------------------------------------------------------------------------------
bool match(Text_iterator first, Text_iterator last, const string& s)
{
string::const_iterator p;
for (p = s.begin();
p != s.end() && first != last && *p == *first;
++p, ++first)
{
}
return p == s.end(); // if we reached end of string, we matched it all
}
//------------------------------------------------------------------------------
Document fread(){
Document doc;
Line lin;
string ifname;
cout << "Please enter file name: ";
cin >> ifname;
ifstream ist(ifname.c_str());               //open input file
if (!ist) throw Document::Error();
ist >> doc;
return doc;
}
void change_text(Document& d, string str1, string str2){
char first_char = str1[0];
Text_iterator p = d.begin();
while (p != d.end()){
p = find(d.begin(), d.end(), first_char);
if (match(p, d.end(), str1)){
p.ln->erase(p.pos, p.pos + str1.size()-1);
p.ln->insert(p.pos, str2[0], str2[str2.size() - 1]);
}
}
}
inline void keep_window_open(){
cin.clear();
cin.sync();
char ch;
cout << "Please enter a charactor to exit:";
cin >> ch;
}
int main()
try{
Document my_doc(fread());
change_text(my_doc, "string1", "string2");
print(my_doc);
keep_window_open();
return 0;
}
catch (Document::Error&) {
cerr << "error\n";
keep_window_open();
return 1;
}
catch (...) {
cerr << "Oops: unknown exception!\n";
keep_window_open();
return 2;
}
解决方案1:

insert 或erase会导致迭代器失效,看erase的返回值

解决方案2:

insert 或erase会导致迭代器失效,从而引发错误。需要重新规整一下迭代器

解决方案3:

STL那么设计就是为了能嵌套用啊。说尽量不要嵌套也是醉了。
lz的问题嘛……
list::iterator last = line.end();
return Text_iterator(last, last->end());
line.end()->end()???


以上介绍了“ 为list<>>定义了一个迭代器,insert和erase出错”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3633037.html

相关图片

相关文章