Итерация векторной карты вперед / назад - PullRequest
0 голосов
/ 29 ноября 2010

У меня есть упорядоченный набор карт ключ / значение в векторе, через который я перебираю.Я знаю уникальный ключ, и на основании этого мне нужно получить пары ключ / значение до и после него, пока я не достигну предела.Например:

QVector < QMap < QString, QString > > map;
QMap < QString, QString > temp;

temp.insert("key1", "parent");
map.append(temp);
temp.clear();
temp.insert("key2", "value1");
map.append(temp);
temp.clear();
temp.insert("key3", "value2");
map.append(temp);
temp.clear();
temp.insert("key4", "value3");
map.append(temp);
temp.clear();
temp.insert("key5", "parent");
map.append(temp);

Допустим, у меня есть значение «key3», и я хочу получить пары ключ / значение до «key3», пока не будет достигнут «parent», а после - до «parent»достигнут (не включая «родитель»), как мне это сделать?Я не могу придумать простой способ.

QMap < QString, QString > newMap;

QMap < QString, QString >::iterator i;
for (int i = 0; i < map.size(); ++i) {

     QMap < QString, QString > vectorMap = map.at(i);
     for (j = vectorMap.begin(); j != vectorMap.end(); ++j) {

          if (j.key() == "key3") {

               //set a bool to true and
               //get j.key() and j.value() before and after until "parent" is reached
               newMap.insert(j.key(), j.value());

          }
     }
}

NewMap будет иметь пары ключ / значение ("key2 / value1", "key3 / value2", "key4 / value3");

Отредактировано для того, что я сейчас пытаюсь:

QString selection = "key3";

 //for going backwards, still need to go forward
 for (int i = 0; i < map.size(); ++i) {

    QMap < QString, QString > vectorMap = map.at(i);
    QMapIterator < QString, QString > iter(vectorMap);

    while (iter.hasNext()) {

        iter.next();

        if (iter.key() == selection &&  iter.value() != "parent") {

            do {

                previousText = iter.previous();

                tempMap.insert(iter.key(), iter.value());
                newMap.append(tempMap);
                tempMap.clear();

                qDebug() << "previousText" << previousText;
                iter.previous();

            } while (previousText != "parent");

        }

    }

 }

Ответы [ 2 ]

0 голосов
/ 30 ноября 2010

Как насчет этого: используйте функцию "найти" вашей карты (или что-то еще), чтобы получить итератор, который указывает на искомый элемент ("key3").Создайте обратный итератор из этого итератора «key3».В двух отдельных циклах продвигайте каждый из этих двух итераторов до тех пор, пока на то, на что он указывает, не содержится «родитель».Внутри каждого цикла собирайте элементы по ходу движения.

0 голосов
/ 29 ноября 2010

edit Теперь, когда я думаю, что понимаю проблему, вот решение моей головы.

Обратите внимание, что для этого используются некоторые характеристики QMap, а именно то, что при выполнении итерации по QMap он итерируется в порядке ключей.Это не относится к ситуации, когда у вашего QMap есть несколько одинаковых ключей.

Очень непроверенный и довольно хакерский на данный момент, но я надеюсь, что это поможет вам преодолеть ваше текущее препятствие.

Я пытался сделать его достаточно чистым, чтобы вы могли понять логику, но вы могли бы использовать QMap::iterator один для перемещения назад и вперед, чтобы определить, какой диапазон копировать.

QVector < QMap < QString, QString > > map;
QMap < QString, QString > temp;

// populate your maps...

QMap < QString, QString > newMap;

// traverse your QVector< QMap<QString, QString> > map...

QString selection = "key3";

QVectorIterator<QMap<QString, QString> > vecIter(map);
while (vecIter.hasNext()) 
{
     // pull out your QMap<QString, QString>    
     QMap<QString, QString> tempMap = vecIter.next();

     // see if selection exists in the map
     if (tempMap.find(selection) != tempMap.end())
     {
         // find list of keys that map to "parent"
         QList<QString> parentKeys = tempMap.keys("parent");

         // get the Key that maps to "parent" that precedes 'selection'
         QString preKey;

         QListIterator<QString> liter(parentKeys);
         while (liter.hasNext())
         {
             if(liter.peekNext() < selection)
             {
                 preKey = liter.next();
             }
             else
             {
                 // we've passed the selection key, break the loop
                 break;
             }
         }

         // now traverse the map and copy
         // QMap::upperBound returns an iterator to the next greatest key after the key you give it
         QMap<QString, QString>::const_iterator mit = tempMap.upperBound(preKey);
         for(; mit != tempMap.constEnd(); ++mit)
         {
             if ((*mit)->value() != "parent"))
             {
                 newMap.insert((*mit)->key(), (*mit)->value());
             }
             else
             {
                 // break out because we've just encountered the "parent" value after our selection
                 break;
             }
         }
     }
} // while (vecIter.hasNext())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...