无法取消引用结束列表迭代器

时间:2019-10-17 07:17:44

标签: c++ linked-list doubly-linked-list

我目前正在从事有关浏览器历史记录的项目。我正在使用STL的列表实现来跟踪不同的网站。我已经弄清楚了大部分,但似乎无法解决错误:

  

屏幕截图;无法取消引用结束列表迭代器。

Screenshot; cannot dereference end list iterator.

网站数据包含在“我的网站”对象中。

class BrowserHistory {
   private:
      list<Site> history;
      list<Site>::iterator current = history.begin();
   public:
      void visitSite(string, size_t)
      void backButton();
      void forwardButton();
      void readFile(string);
};

void BrowserHistory::visitSite(string x, size_t y)
{
   while (current != history.end()) {
       history.pop_back();
   }
   history.push_back({ x, y });
   current++;
}

void BrowserHistory::backButton()
{
   if (current != history.begin())
       current--;
}

void BrowserHistory::forwardButton()
{
   if (current != history.end())
       current++;
}

void BrowserHistory::readFile(string filename)
{
   string action, url;
   size_t pageSize;
   ifstream dataIn;
   dataIn.open(filename);

   while (!dataIn.eof()) {
       dataIn >> action;
       if (action == "visit") {
           dataIn >> url >> pageSize;
           history.push_back({ url, pageSize });
           current++;
       }
       if (action == "back") {
           current--;
       }
       if (action == "forward") {
           current++;
       }
   }
   dataIn.close();
}

谁能向我解释怎么了?预先感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

初始化current时,列表为空。
将元素添加到列表不会突然使它成为有效的迭代器,即使它与end不同。

看起来您在考虑迭代器非常类似于指针,但事实并非如此。

迭代器用于迭代,应被视为瞬态,不应将其存储供以后使用。

使用向量,并为current使用索引,而不是迭代器。

此外,我会将“按钮”功能(历史记录关心按钮?)重命名为“ goBack”和“ goForward”,并在阅读时使用您的实际界面:

void BrowserHistory::readFile(string filename)
{
   ifstream dataIn(filename);
   string action;

   while (dataIn >> action) {
       if (action == "visit") {
           string url;
           size_t pageSize;
           if (dataIn >> url >> pageSize) {
               visitSite(url, pageSize);
           }
           else {
               // Handle error
           }
       }
       else if (action == "back") {
           goBack();
       }
       else if (action == "forward") {
           goForward();
       }
       else {
           // Handle error
       }
   }
}