矢量地图迭代正向/反向

时间:2010-11-29 18:52:55

标签: c++ qt vector qt4 map

我在迭代的向量中有一组有序的键/值映射。我知道一个唯一的密钥,基于此,我需要在它之前和之后获得键/值对,直到达到极限。例如:

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”(不包括“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 :(得分:0)

编辑现在,我认为我理解了这个问题,这是一个解决方案。

请注意,这会利用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())

答案 1 :(得分:0)

这个怎么样:使用你的地图的“查找”功能(或其他)来获得指向你正在寻找的项目的迭代器(“key3”)。从“key3”迭代器构造一个反向迭代器。在两个单独的循环中推进这两个迭代器中的每一个,直到它指向包含“父”的内容。在每个循环中,随时收集元素。