【发布时间】:2012-05-05 19:02:11
【问题描述】:
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)”并一一分配结构值来避免上述问题:
#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}
但据我了解,这将逐个遍历整个地图,不是吗?如果是,那么可以这样做吗:
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;
}
通过这样做,我们避免了迭代,并且内存中的垃圾与我们的标识符匹配的可能性是......我猜是很小的,特别是如果我们使用一些哈希。 那么这样做可以(安全)吗?
【问题讨论】:
-
搜索具有给定键的元素不会遍历整个地图,请参阅下面的答案。
标签: c++ search map constructor struct