Использование итератора std :: string для поиска начала и конца строки - PullRequest
10 голосов
/ 03 марта 2010

Учитывая только итератор std :: string, можно ли определить начальную и конечную точки строки? Предположим, что у меня нет доступа к строковому объекту, и поэтому я не могу вызвать string.begin () и string.end (), и все, что я могу сделать, - это увеличивать или уменьшать итератор и проверять значение.

Спасибо, Фил

Ответы [ 2 ]

6 голосов
/ 03 марта 2010

Короткий ответ - нет. Длинный ответ таков: поскольку от итераторов не ожидается, что они будут знать о контейнерах или диапазонах, для которых выполняется итерация, ожидается, что они будут

  • Уметь переходить к следующему элементу (вкл. Или декар. К следующему или пред.)
  • Разыщите себя, чтобы показать ссылку на значение, на которое они указывают
  • И, конечно же, сравнивайте себя с другими итераторами, что наиболее важно, с каким-то «конечным» итератором.

Кроме того, некоторые типы итераторов могут делать больше, чем просто выше, но, в принципе, все они должны иметь / выполнять вышеприведенное в той или иной форме.

1 голос
/ 03 марта 2010
  • Для конечной точки строки: Предположим, что внутренняя строка символов заканчивается нулем. Затем путем разыменования итератора, чтобы увидеть, являются ли они '\ 0', чтобы определить следующую позицию, является конечной точкой. Но для другой строки, не заканчивающейся нулем, такую ​​информацию узнать невозможно.
  • Для начальной точки строки: Нет способа сделать это.

Стандартный std :: string :: iterator - это случайный двунаправленный итератор, который ничего не знает о контейнере.

Но если вы работаете на платформе Visual C ++, возможно, вы можете использовать какой-нибудь способ взлома, например, следующий, чтобы получить элемент управления для своего контейнера, но это очень опасно:

  // it is the passed in string::iterator parameter.
  if (it._Has_container()) {
      string* strRef = (string*)it._Mycont;
  }
...