理由は簡単です。コピー オン ライト、別名。暗黙の共有
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