Значения QMap как структуры - PullRequest
0 голосов
/ 26 ноября 2018

Допустим, у нас есть этот пример:

struct test
{
    QString name;
    int count = 0;
};

QMap<QString,test> map;
test test1;
test1.name = "doc1";
map.insertMulti("pen",test1);

test test2;
test2.name = "doc2";

map.insertMulti("pen",test2);

if(map.contains("pen"))
{
    map.value("pen",test1).count++; // Here goes the error
  //map["pen"].count++; //works but increments count of last inserted struct
}

foreach (test value, map) {
    qDebug() << value.name << " " << value.count;
}

Итак, я пытаюсь проверить, есть ли ключ, и увеличить счетчик необходимой мне структуры.

Пожалуйстапосоветуйте, как это сделать правильно.

1 Ответ

0 голосов
/ 26 ноября 2018

value() возвращает постоянное значение, которое нельзя изменить, вместо этого Вы должны использовать итератор, используя метод find():

struct Test{
    QString name;
    int count = 0;
};

QMultiMap<QString, Test> map;
Test test;
test.name = "doc1";
map.insert("pen", test);

if(map.contains("pen")){
    qDebug() << "before: " << map.value("pen").count;
    QMultiMap<QString, Test>::iterator it = map.find("pen");
    it->count += 10;
    qDebug() << "after: " << map.value("pen").count;
}

Вывод:

before:  0
after:  10

Обновление:

В случае QMap вы должны использовать оператор [] , который возвращает ссылку на сохраненный файлзначение:

struct Test{
    QString name;
    int count = 0;
};

QMap<QString, Test> map;
Test test1;
test1.name = "doc1";
map.insertMulti("pen",test1);

Test test2;
test2.name = "doc2";
map.insertMulti("pen", test2);

if(map.contains("pen")){
    qDebug() << "before: " << map.value("pen").count;
    map["pen"].count++;
    qDebug() << "after: " << map.value("pen").count;
}

Вывод:

before:  0
after:  1

Обновление:

Вы должны использовать find () дляполучите итератор первого элемента с ключом, и если вы хотите получить доступ к элементу с тем же ключом, вы должны увеличить итератор.

struct Test{
    QString name;
    int count = 0;
};

QMap<QString, Test> map;
Test test1;
test1.name = "doc1";
map.insertMulti("pen",test1);

Test test2;
test2.name = "doc2";
map.insertMulti("pen", test2);

if(map.contains("pen")){
    // get the first item with the key
    QMap<QString, Test>::iterator it = map.find("pen");
    // the next element
    it++;
    // update value
    it->count++;
}

for(const Test & value: map){
    qDebug() << value.name << " " << value.count;
}

Вывод:

"doc2"   0
"doc1"   1
...