Перебирая список, чтобы найти вхождения элемента. Проблема с кодом - PullRequest
0 голосов
/ 19 мая 2019

Кто-нибудь знает, что не так с этим кодом? Я получаю следующую ошибку компиляции. Цель состоит в том, чтобы найти вхождения строки «p», и я взял идею из Stroustrup P57. Я предполагаю, что я мог бы просто увеличить итератор, чтобы найти дополнительные вхождения, но это не работает. Спасибо

find.cc: In function ‘int main(int, char**)’:
find.cc:34:16: error: no match for ‘operator+’ (operand types are ‘LI {aka std::_List_const_iterator<Ent>}’ and ‘int’)
     i = find(i + 1, l.end(), e1);
#include <iostream>
#include <algorithm>
#include <list>
#include <string>

using namespace std;

struct Ent {
  string name;
  Ent(const string& name) : name(name) { }
  bool operator== (const Ent& right) const {
    return name == right.name;
  }
};

int main(int argc, char *argv[])
{
  list<Ent> l;

  for (char c = 'a'; c <= 'z'; c++) {
    Ent e(string(1, c));
    l.push_back(e);
  }

  Ent e1("p");

  typedef list<Ent>::const_iterator LI;

  LI i = find(l.begin(), l.end(), e1);

  int n = 0;
  while (i != l.end()) {
    ++n;
    i = find(i + 1, l.end(), e1);
  }

  cout << "find(" << e1.name << ") = " << n << endl;

  return 0;
}

1 Ответ

1 голос
/ 19 мая 2019

Итераторы списков являются двунаправленными итераторами, но не итераторами randomaccess.Следовательно, у них нет operator+, а только operator++.Вместо этого вы можете написать

++i;
i = find(i , l.end(), e1);

.

...