質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

Q&A

2回答

2253閲覧

【Qt】QMap型のinsert()について

yhirasawa

総合スコア2

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

0グッド

0クリップ

投稿2021/11/24 08:10

お世話になります。

C++のソースコードの解析中にQMap型クラスの変数を使って、
insert()関数を使っているコードがあります。

QMap<QString, QString> 変数名;
QString vix = 変数.get("video_index"); 変数名.insert(QStringLiteral("video_index"), vix)

この状態でのinsert()はどんな処理をしているのか分かりません。
情報があればよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BeatStar

2021/11/24 09:17 編集

まずは過去質問からどうにかしたらどうでしょうか? https://teratail.com/questions/368837 釣りなのかな?(釣りでないなら返信するなりBA選ぶなりするはずだし…)
yhirasawa

2021/11/25 00:50

釣りではありません。 ただ、Qtの、QMapクラスのinsert()を調べたのですが、ほとんどどんな処理をしているのか分からなくて、質問させていただきました。
BeatStar

2021/11/25 00:54

失礼しました。 では、そもそもQMapが何者なのかわかりますか?(たとえば『どういう責務があるか』とか『他のQVector等とはどこが違うか』とか) これらがわかっていればもうちょっとです。
BeatStar

2021/11/25 00:55

ただ、調べ方は前回のsetなんたらの調べ方と大差ありません。
BeatStar

2021/11/25 02:08

それと、Qtのバージョンも書きましょう。
guest

回答2

0

すでにBeatStarさんが回答されているので蛇足かもしれません。

Qt5(でいいのかな?)のマニュアル(https://doc.qt.io/qt-5/qmap.html)によるとQMapはdictionary(連想配列)のようです。

insertメソッド(メンバ関数)の説明は次ですね。
https://doc.qt.io/qt-5/qmap.html#insert

つまり、「変数」から取得した何らかのデータを「変数名」にセットしているのではないでしょうか。

一部想像で補ってみました。

c++

1#include <QMap> 2#include <QSet> 3#include <QDebug> 4 5class Catalog 6{ 7public: 8 explicit Catalog(QObject *parent = nullptr) 9 { 10 db["video_index"] = "12"; 11 db["audio_index"] = "234"; 12 } 13 14 ~Catalog() = default; 15 16 QString get(const QString &key) { 17 QString result{"NOT_FOUND_!!"}; 18 if (db.contains(key)) 19 { 20 result = db.value(key); 21 } 22 else { 23 qWarning() << "Not found"; 24 } 25 return result; 26 } 27 28private: 29 QMap<QString, QString> db; 30}; 31 32int main(int argc, char* argv[]) 33{ 34 /* 35 * get()メソッドを持つ何かがあるんですね。 36 * 勝手な想像で設けました。あってますか? 37 */ 38 Catalog c1; 39 40 /* 41 * 以下、今回の課題 42 */ 43 QMap<QString, QString> m1; 44 QString vix = c1.get("video_index"); 45 m1.insert(QStringLiteral("video_index"), vix); 46 qDebug() << m1; 47 48 /* 49 * 仮に同じようなことを続けたらどうなる? 50 * 51 */ 52 m1.insert(QStringLiteral("video_index"), "次の値"); 53 qDebug() << m1; 54 55 56 /* 57 * 仮に同じようなことを続けたらどうなる? 58 * 59 */ 60 QString aix = c1.get("audio_index"); 61 m1.insert(QStringLiteral("audio_index"), aix); 62 qDebug() << m1; 63 64 return 0; 65}

結果は次です。

QMap(("video_index", "12")) QMap(("video_index", "次の値")) QMap(("audio_index", "234")("video_index", "次の値"))

投稿2021/11/28 07:58

jiro.kaihatsu

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

とりあえず基礎からやりましょう。

QtはWidgetツールキットと呼ばれるもので、ウィンドウとかをクラスプラットフォーム(WindowsだのMacOSだののようなOSに依存しないやつ)を提供します。
(ここは基礎ではないが)

質問者さんに欠けていると思われるのが、

■ クラス ■ 関数 ■ メンバ関数 ■ データ構造とアルゴリズム

ですかね。(もしかしたら他にもあるかもしれないが)

QMapはクラスです。公式にも『QMap Class』とあります。

で、QMapとはなんぞやの前に、『リスト構造』等のデータ構造を学んでください
これをやらないと意味がわからなくなります。

公式によると、赤黒木で実装されたマップですね。
赤黒木は私はよくわかりませんが、木構造の一種のようです。

このQMapは簡単にいうと、キーと値を一つのペアとしてみなし、とある木構造(赤黒木)で構成しつつ、取り出すときはキーから割り出して値を取り出すものです。

つまり、std::vectorとかのようなものです。(構造は違うが、データを保持するという意味では同じ)

QString vix = 変数.get("video_index"); 変数名.insert(QStringLiteral("video_index"), vix)

…だから、端折るなと。

まあいい。変数とやらからget、つまりデータを取り出して、vixに入れる。
そして、変数名とやらに『追加』する。
Insert、差し込むということからもわかるはずです。

QStringLiteralとやらはQStringのページにあるマクロのやつの一つで、
『コンパイル時に』、『読み込み専用』としてQStringにするやつのようです。

つまり、”video_index”というキーと、vixの値を値としたペアでQMapに追加している…と思う。

ただ、変数とか言われてもわかりません。
変数は一つしかないのならともかく、いろんなものがあります。
実務とかだとなおさら。

情報は端折らないように!!!!

そこが釣りにしか見えない要因でもある。

投稿2021/11/25 01:39

編集2021/11/25 02:02
BeatStar

総合スコア4958

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問