Непонятки с QMap....
struct uoCell
{
uoCell():m_nomber(0){};
int m_nomber;
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QDialog dlg;
QMap<int,uoCell*> map;
for (int i = 1; i<10; i++)
{
if (!map.contains(i)){
uoCell* cell = new uoCell;
cell->m_nomber = i;
cout << "insert" << i;
map.insert(i,cell);
}
}
uoCell* cell2 = NULL;
QMap<int,uoCell*>::iterator it = map.find(5);
while(it != map.begin()){
cell2 = it.value();
cell2->m_nomber += 0;
cout << "find" << cell2->m_nomber;
--it;
}
dlg.show();
return app.exec();
}
Не понимаю вопроса.
Думаю правильно, однако я привык, что с бегина по энд и с энда по бегин выведется все.
А тут нужны какие-то извраты.
Путем "тыка" нашел нужные мне "нормальные" проходные алгоритмы:
QMap<int,uoCell*> map;
for (int i = 1; i<=10; i++)
{
if (!map.contains(i)){
uoCell* cell = new uoCell;
cell->m_nomber = i;
cout << "\n insert: \t" << i;
map.insert(i,cell);
}
}
uoCell* cell2 = NULL;
QMap<int,uoCell*>::iterator it;
it = map.find(5);
cout << "\n\n test1 5->1 \n";
while(it != map.begin()){
cell2 = it.value();
cell2->m_nomber += 0;
cout << "\n find \t" << cell2->m_nomber << " key: " << it.key();
--it;
}
cout << "\n\n test2 1->10 \n";
it = map.begin();
while(it != map.end()){
cell2 = it.value();
cell2->m_nomber += 0;
cout << "\n find \t" << cell2->m_nomber << " key: " << it.key();
++it;
}
cout << "\n\n test3 10-1 \n";
it = map.end();
do {
--it;
cell2 = it.value();
cell2->m_nomber += 0;
cout << "\n find \t" << cell2->m_nomber << " key: " << it.key();
}while(it != map.begin());
cout << "\n\n test4 5->10 \n";
it = map.find(5);
while(it != map.end()){
cell2 = it.value();
cell2->m_nomber += 0;
cout << "\n find \t" << cell2->m_nomber << " key: " << it.key();
++it;
}
cout << "\n\n test5 5->1 \n";
it = map.find(5);
bool last = false;
do {
if (last)
--it;
last = true;
cell2 = it.value();
cell2->m_nomber += 0;
cout << "\n find \t" << cell2->m_nomber << " key: " << it.key();
}while(it != map.begin());
Тут нет никаких извратов, просто не забывайте, что begin() - это указатель на первый элемент, а end() - на следующий за последним.
Так принято в stl и Qt тоже
Именно поэтому мы пишем
for(...it = cont.begin(); it != cont.end(); ++it)
{}
while(it != cont.begin())
{
...
--it;
}
Ок.
С QMap пока ПЛОТНО не работал. По этому и хм...
Но восновном меня интересовали сейчас направления с
- энд до бегина,
- c find to end;
- c find to begin;
В общем, все уже объяснили. В stl для этого есть reverse_iterator, rbegin() и rend(). К сожалению, в QMap они, насколько я понимаю, отсутствуют напрочь....
Итераторы для меня тема тёмная и чем больше пытаюсь вникнуть в них, тем больше меня тянет к index-based вариантам реализациям перебора.
Если только так:
void QMapIterator::toBack ()
bool QMapIterator::hasPrevious () const
Item QMapIterator::previous()
http://www.crossplatform.ru/node/272
Qt предоставляет http://www.doc.crossplatform.ru/qt/4.5.0/containers.html#the-iterator-classes
Нужно помнить, что map (QMap) сортирует элементы по ключу, именно поэтому к ключу предъявляется требование less-then comparable(т.е. определена операция <).
Поэтому при обычном переборе он и будет отдавать элементы в порядке возрастания ключей. А как он устроен внутри - дело второе.
Если порядок элементов не важен (или для ключа недоступна операция <) - можно пользоваться QHash
to SABROG, все-таки итераторы гораздо более универсальны, чем индексы. Индексы - это по сути только последовательные контейнеры, которые предоставляют произвольный доступ (vector, deque, в Qt QList).
А вот когда существует не один вариант обхода контейнера - итераторы рулят, например дерево:
post_order_iterator - узел после детей
pre_order_iterator - узел перед детьми
breadth_first_iterator - все узлы по уровням и т.п.
Кстати, rbegin(), rend() - простейшие примеры нестандартного обхода
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)