Проверка, ссылается ли итератор на элемент в списке - PullRequest
0 голосов
/ 02 марта 2010

Я просто хочу проверить, указывает ли итератор на объект в списке.

Что такое cmd?

Спасибо. :)

SkyThe

EDIT:

Хммм .. ладно, я попробовал. Теперь возникает ошибка: «Выражение: список итераторов несовместим»

Может быть, какой-то код:

#include <list>
list<obj> list;
list<obj>::iterator it;

if(it != list.end()){ //here the error pops up when i debug
  vShowStatus();
}else{
  cout << "...";
}

Ответы [ 5 ]

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

Вы не можете. Нет способа проверить это. Вы должны структурировать свой код так, чтобы ваш итератор находился между list.begin () и list.end ().

Используйте итератор следующим образом:

for (std::list<int>::const_iterator it = myList.begin(); it != myList.end(); ++it)
         cout << *it << " ";

Невозможно сравнить [ EDIT ] списка итераторов с реляционными операторами (<,>, <=,> =), поэтому, когда вы используете итератор вне цикла for, вы всегда должны проверять если вы выходите за пределы, сравнивая метод begin () (если вы идете назад с --it) или с end () (если вы идете вперед с ++ it).

std::list<int>::const_iterator it = ... // initialized with some CORRECT value
// going backward
while (true)
{
    cout << *it;
    if (it == list.begin())
        break;
    --it;
}
// going forward
while (true)
{
    cout << *it;
    ++it;
    if (it == list.end())
        break;
}
// or simplier
while (it != list.end())
{
    cout << *it;
    ++it;
}

Если по какой-то причине вам действительно нужна проверка, вы можете перебрать список и проверить, равен ли какой-либо из итераторов вашему. Но это может оказать значительное влияние на производительность, поэтому используйте его только в отладке и / или в тестах.

1 голос
/ 02 марта 2010

В стандарте говорится об неинициализированных итераторах (24.1.5):

Итераторы также могут иметь единственное число значения, которые не связаны с любой контейнер. Например, после объявление неинициализированного указатель x (как с int* x;), x должен всегда предполагалось иметь единственное число значение указателя. Результаты большинства выражения не определены для единственного числа ценности; единственное исключение присвоение неособого значения итератор, который содержит единственное число значение. В этом случае единственное значение перезаписывается так же, как и любой другое значение.

Итак, нет. Поскольку единственное, что вы можете сделать с неинициализированным (или недействительным) итератором, - это сделать его действительным итератором, нет способа проверить, есть ли он у вас. Всегда инициализируйте объявленные итераторы (также ограничьте область, в которой вы их используете), и убедитесь, что вы не продолжаете использовать итератор после операции аннулирования.

Возможно, однако, что конкретная реализация SC ++ L вашего компилятора отслеживает неинициализированные итераторы и выдает ошибку того типа, который вы видите, если вы делаете что-то недопустимое с итератором. Это никоим образом не гарантированный результат.

1 голос
/ 02 марта 2010

Читать о C ++ Iterators

Например:

vector<int> the_vector;
vector<int>::iterator the_iterator;


for( int i=0; i < 10; i++ ) the_vector.push_back(i);
int total = 0;
the_iterator = the_vector.begin();
while( the_iterator != the_vector.end() ) {
  total += *the_iterator;
  ++the_iterator;
}

cout << "Total=" << total << endl;
0 голосов
/ 02 марта 2010

У вас есть неинициализированный итератор. Я не думаю, что есть способ проверить, не инициализирован ли он. (Во-первых, всегда инициализируйте свои переменные, чтобы избежать этой проблемы.)

Вы можете определить, указывает ли инициализированный итератор на что-либо в списке, сравнивая его с конечным итератором списка того же .

0 голосов
/ 02 марта 2010
if (it!=collection.end()) std::cout << "Iterator points to data" << std::endl;
else                      std::cout << "Iterator does not point to data" << std::endl;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...