Q#1) 以下の構造体はコピーされたくないため、コンパイル エラーが発生します - なぜ、どのように対処すればよいですか?
#include <iostream>
#include <string>
#include <map>
using namespace std;
struct person
{
person(string n)
:name(n)
{}
string name;
};
int main()
{
map<string, person> my_map;
my_map["one"] = person("Tom");
return 0;
}
Q#2) 構造体コンストラクタ "person(const string& n)" を省略し、構造体の値を 1 つずつ割り当てることで、上記の問題を回避できます。
#include <iostream>
#include <string>
#include <map>
using namespace std;
struct person
{
string name;
};
int main()
{
map<string, person> my_map;
person p;
p.name = "Tom";
my_map["one"] = p;
return 0;
}
それで、私はこのようにして、多くの人をマップに保存した後、特定の人がマップ内に存在するかどうかを確認したいとしましょう。私が知っているように、それを行う正しい方法は次のとおりです。
if(my_map.find("one") == my_map.end()) { //it doesn't exist in my_map }
else {//it exists}
しかし、私が理解しているように、これはマップ全体を 1 つずつ反復しますね。はいの場合、次のようにしても問題ありません。
using namespace std;
struct person
{
string name;
string identifier; // <--
};
int main()
{
map<string, person> my_map;
person p;
p.name = "Tom";
p.identifier = "something"; // <--
my_map["one"] = p;
if(my_map["unknown"].identifier == "something") // <--
cout << "Found" << endl;
else
cout << "Not found" << endl;
return 0;
}
これを行うことで、反復を回避でき、メモリ内のガベージが識別子と一致する可能性は... 小さいと思います。特に、ハッシュを使用する場合はそうです。では、そのようにして (安全に) 大丈夫ですか?