2012-02-12 3 views
0

У меня есть следующий код в моем проекте:Итератор против не-итератор цикла, отличается выход, C++

std::cout << "Without iterator:\n"; 

std::vector<RectangleCluster*> rc = p->getInnerRegionPolygons().at(0)->getClusters(); 

for (int i = 0; i < rc.size(); i++) 
    std::cout << "Cluster " << rc.at(i)->getId() << ": start = " << rc.at(i)->getOverlapAtStart() << ", end = " << rc.at(i)->getOverlapAtEnd() << std::endl; 

std::cout << "\n\nWith iterator:\n"; 

for (std::vector<RectangleCluster*>::iterator ci = p->getInnerRegionPolygons().at(0)->getClusters().begin(); ci != p->getInnerRegionPolygons().at(0)->getClusters().end(); ++ci) 
    std::cout << "Cluster " << (*ci)->getId() << ": start = " << (*ci)->getOverlapAtStart() << ", end = " << (*ci)->getOverlapAtEnd() << std::endl; 

Выход консоли выглядит следующим образом:

Без итератора:
Cluster 0: начать = 65,4238, конец = 64,9811
Кластер 1: старт = 64,9811, конец = 17,9983
Кластер 2: начало = 17,9983, конец = 17,9983 ...

С итератора:
Cluster 34026352: начало = 1.68113e-316, конец = 1.68113e-316
Кластер 1: старт = 64,9811, конец = 17,9983
Кластер 2: начало = 17,9983, конец = 17,9983 ...

Выход после «...» также равен. Почему код без итератора дает мне «Cluster 0: start = 65.4238, end = 64.9811» и код с итератором «Cluster 34026352: start = 1.68113e-316, end = 1.68113e-316»?

С наилучшими пожеланиями Гернот

+2

Здесь нет достаточной информации, чтобы сказать с уверенностью. (В общем случае * минимальный * полный пример задает вопросы намного легче ответить). Использует ли 'p-> getInnerRegionPolygons(). At (0) -> getClusters()' возврат по значению или по ссылке? Я бы поставил прежний – Flexo

+0

Если это значение, ваш итератор инициализируется одной копией вектора, а проверка выполняется против другого конца итератора другой копии! Не уверен, каков эффект в этом случае. Можете ли вы попытаться инициализировать массив одной переменной и взять итератор ИЛИ открыть интерфейс p-> getInnerRegionPolygons(). At (0), чтобы обеспечить итератор? – PermanentGuest

ответ

3

Пожалуйста, перепишите код с итераторы, как:

for (std::vector<RectangleCluster*>::iterator ci = rc.begin(); ci != rc.end(); ++ci) 
    std::cout << "Cluster " << (*ci)->getId() << ": start = " << (*ci)->getOverlapAtStart() << ", end = " << (*ci)->getOverlapAtEnd() << std::endl; 

Я согласен с комментарием awoodland в. Скорее всего, p-> getInnerRegionPolygons(). At (0) -> getClusters() возвращает новый вектор для каждого вызова. И неверно сравнивать итераторы из разных контейнеров внутри для оператора (...).

Смежные вопросы