[C++] for와 함께 QMap 반복


Answers

C ++ 11 range-based-for는 역 참조 된 iterator의 타입을 자동으로 추론 된 "cursor"타입으로 사용합니다. 여기서는 *map.begin() 표현식의 유형입니다.
그리고 QMap::iterator::operator*() 는 ( QString & 타입의) 값에 대한 참조를 반환하기 때문에, 그 메소드를 사용하여 키에 접근 할 수 없다.

설명서에 설명 된 반복기 방법 중 하나를 사용해야하지만 사용하지 않는 것이 좋습니다.

  • keys() 는 키 목록을 생성 한 다음 각 키의 값을 검색하기 때문에 발생합니다.
  • toStdMap() 모든지도 요소를 다른지도 요소로 복사하기 때문에,

그건별로 좋지 않을거야.

래퍼를 사용하여 QMap::iteratorauto 유형으로 사용할 수도 있습니다.

template<class Map>
struct RangeWrapper {
    typedef typename Map::iterator MapIterator;
    Map &map;

    RangeWrapper(Map & map_) : map(map_) {}

    struct iterator {
        MapIterator mapIterator;
        iterator(const MapIterator &mapIterator_): mapIterator(mapIterator_) {}
        MapIterator operator*() {
            return mapIterator;
        }
        iterator & operator++() {
            ++mapIterator;
            return *this;
        }
        bool operator!=(const iterator & other) {
            return this->mapIterator != other.mapIterator;
        }
    };
    iterator begin() {
        return map.begin();
    }
    iterator end() {
        return map.end();
    }
};

// Function to be able to use automatic template type deduction
template<class Map>
RangeWrapper<Map> toRange(Map & map)
{
    return RangeWrapper<Map>(map);
}

// Usage code
QMap<QString, QString> extensions;
...
for(auto e : toRange(extensions)) {
    fout << e.key() << "," << e.value() << '\n';
}

다른 래퍼가 있습니다 .

Question

나는 QMap 객체를 가지고 있으며 그 내용을 파일에 쓰려고합니다.

QMap<QString, QString> extensions;
//.. 

for(auto e : extensions)
{
  fout << e.first << "," << e.second << '\n';
}  

왜 나는 : error: 'class QString' has no member named 'first' nor 'second'

QPair 유형이 QPair ?




"오래된"C ++에서 Qt를 사용하면 다음과 같이 할 수 있습니다.

QMap< QString, whatever > extensions;
//...
foreach( QString key, extensions.keys() )
{
    fout << key << "," << extensions.value( key ) << '\n';
}

여기에 C ++ 11 컴파일러가 없지만 다음과 같이 작동 할 수 있습니다.

for( auto key: extensions.keys() )
{
    fout << key << "," << extensions.value( key ) << '\n';
}

iterators를 대신 사용할 수도 있고, hmuelners 링크를 사용하고 싶다면 체크해보십시오.




나는 내 자신의 결과를 얻기 위해 이런 것을 사용했다. 누군가가 키와 값을 따로 필요로하는 경우를 대비하여.

{
   QMap<int,string> map; 

   map.insert(1,"One");
   map.insert(2,"Two");
   map.insert(3,"Three");
   map.insert(4,"Four");   

   fout<<"Values in QMap 'map' are:"<<endl;
   foreach(string str,map)
   {
     cout<<str<<endl;
   };


   fout<<"Keys in QMap 'map' are:"<<endl;
   foreach(int key,map.keys())
   {
     cout<<key<<endl;
   }; 
}