[解決済み] 地図に要素を挿入するおすすめの方法【重複】について
2022-10-20 17:26:42
質問
重複の可能性があります。
STLマップでは、[]よりもmap::insertを使う方が良いのでしょうか?
マップに要素を挿入する場合、どのような方法が推奨されるのでしょうか?私は
map[key] = value;
または
map.insert(std::pair<key_type, value_type>(key, value));
以下のような簡単なテストをしてみました。
#include <map>
#include <string>
#include <iostream>
class Food {
public:
Food(const std::string& name) : name(name) { std::cout << "constructor with string parameter" << std::endl; }
Food(const Food& f) : name(f.name) { std::cout << "copy" << std::endl; }
Food& operator=(const Food& f) { name = f.name; std::cout << "=" << std::endl; return *this; }
Food() { std::cout << "default" << std::endl; }
std::string name;
};
int main() {
std::map<std::string, Food> m0;
/*
1) constructor with string parameter
2) copy
3) copy
4) copy
*/
m0.insert(std::pair<std::string, Food>("Key", Food("Ice Cream")));
/*
1) constructor with string parameter
2) default
3) copy
4) copy
5) =
*/
// If we do not provide default constructor.
// C2512: 'Food::Food' : no appropriate default constructor available
m0["Key"] = Food("Ice Cream");
}
-
メンバ関数
insert
を使用することで、より少ない値の関数呼び出しが関与することになります。ではinsert
を使うのは推奨される方法ですか? -
なぜデフォルトのコンストラクタが必要なのでしょうか?
map[key] = value
の方法が使われているのに、なぜデフォルトのコンストラクタが必要なのですか?
私が知っているのは
insert
は存在のキー・バリュー・ペアを上書きしないことは知っていますが
map[key] = value
は上書きされます。しかし、両者のどちらかを選択しようとするとき、考慮すべき要素はこれだけなのでしょうか?
どうでしょう。
- パフォーマンス
- 値のデフォルトコンストラクタの可用性
- ???
どのように解決するのですか?
-
insert
は推奨される方法ではなく、地図に挿入する方法の1つです。との違いはoperator[]
はinsert
がその要素をマップに挿入しているかどうかを判断できることです。また、クラスにデフォルトのコンストラクタがない場合、強制的にinsert
. -
operator[]
がデフォルトコンストラクタを必要とするのは、マップが要素が存在するかどうかをチェックするためです。存在しない場合は、デフォルトコンストラクタを使用して要素を作成し、参照(またはそれへの const 参照)を返します。
マップコンテナはキー値の重複を許さないため、挿入操作では挿入される各要素について、同じキー値を持つ別の要素がコンテナ内にすでに存在するかどうかをチェックします。
関連
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み] C++でintをstringに変換する最も簡単な方法
-
[解決済み] std::vectorをハードコードされた要素で初期化する最も簡単な方法は何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++
-
[解決済み】STLのマップでは、[]よりもmap::insertを使う方が良いのか?]