1

次のコードが QString-Objects を QList に保存しない理由を理解するのに問題があります

QMap<QString, QList<QString> >map;
map = QMap<QString, QList<QString> >();
map.insert("eins", QList<QString>());
QList<QString> listInMap = map["eins"];
listInMap.append("test1");
listInMap.append("test2");
QList<QString> copyOfListInMap = map.value("eins");
qDebug() << copyOfListInMap.count();

出力: 0

4

2 に答える 2

2

理由は簡単です。コピー オン ライト、別名。暗黙の共有

QList<QString> listInMap = map["eins"];

この時点では、まだハード コピーは取得されておらず、「参照」のみが取得されています。これは標準的な C++ の意味では公平ではありませんが、「浅いコピー」と考えてください。ただし、ここに追加を開始すると、リストがコピーされ、元のリストは空のままになります。それは、QList がCoW (copy-on-write) の方法で実装されているためです。

listInMap.append("test1");
listInMap.append("test2");

余談ですが、QStringListをご覧になることをお勧めします。QList を継承していますが、いくつかの追加の便利なメソッドもあります。

今、あなたは尋ねているかもしれません: How am I supposed to fill my map in, then?.

マルチマップ

個人的には、 QMultiMap を使用するか少なくともinsertMultiを使用することをお勧めします。QMap

main.cpp

#include <QMap>
#include <QDebug>
#include <QString>

int main()
{
    QMultiMap<QString, QString> map;
    map.insert("eins", "test1");
    map.insert("eins", "test2");
    qDebug() << map.count();
    return 0;
}

main.pro

TEMPLATE = app
TARGET = main
QT = core
SOURCES += main.cpp

ビルドして実行

qmake && make && ./main

出力

2

シングルマップ

現在のアプローチに固執する場合は、値を新しい QStringList に追加して値を上書きするか、まったく同じリストへの参照を保持することをお勧めします。

そうは言っても、あなたの場合、挿入用の外部ストレージを検討することさえ少しやり過ぎに見えます. 私の謙虚な意見では、あなたはすぐにそれを行うべきです。

main.cpp

#include <QMap>
#include <QDebug>
#include <QString>

int main()
{
    QMap<QString, QStringList> map;
    map.insert("eins", QStringList{"test1", "test2"});
    qDebug() << map.value("eins").count();
    return 0;
}

main.pro

TEMPLATE = app
TARGET = main
QT = core
CONFIG += c++11
SOURCES += main.cpp

ビルドして実行

qmake && make && ./main

出力

2
于 2014-12-23T16:20:30.290 に答える