首页新闻找找看学习计划

C++ STL - unordered_map

0
悬赏园豆:10 [已解决问题] 解决于 2018-06-29 16:39

IDE:vs2015

 

 1 #include<unordered_map>
 2 #include<string>
 3 #include<vector>
 4 #include<iostream>
 5 
 6 using namespace std;
 7 
 8 class Point
 9 {
10 public:
11     Point(int id, int x, int y) :id_(id), x_(x), y_(y)
12     {
13         cout << " id_ = " << id_ << " x_ = " << x_ << " y_ = " << y_ << endl;
14     }
15 
16     Point(const Point& p)
17     {
18         this->id_ = p.id_;
19         this->x_ = p.x_;
20         this->y_ = p.y_;
21     }
22 
23     ~Point() {};
24     int id_;
25 
26 private:
27     int x_, y_;
28 };
29 
30 void dosomething(Point &points_)
31 {
32     unordered_map<int, Point> unordmap_points;
33     if (unordmap_points.find(points_.id_) == unordmap_points.end())
34     {
35         cout << "hello!" << endl;
36         unordmap_points.insert(make_pair(points_.id_, points_));
37     }
38     else
39     {
40         
41         //unordmap_points[points_.id_] = points_;
42         cout << "goo-bye" << endl;
43     }
44 }
45 
46 int main()
47 {
48     vector<Point> points;
49     const int maxnum[5] = {0,1,2,3,4};
50     for (int i : maxnum)
51     {
52         points.push_back(Point(i, i, i));
53     }
54     
55     for (int i : maxnum)
56     {
57         dosomething(points[i]);
58     }
59     return 1;
60 }

41行代码注释后的的输出:

 

取消注释41行后:编译器报错

:   

错误 C2512 “Point::Point”: 没有合适的默认构造函数可用 TEST1 d:\program files (x86)\microsoft visual studio 14.0\vc\include\tuple 1180

 

请问该怎么改?

 另外,个人觉得 函数 dosomething() 中的 else情形是多余的?不知道为什么,看到某底层代码有else,搞不懂,来个大神解释一波哈?

winslam的主页 winslam | 初学一级 | 园豆:188
提问于:2018-06-15 22:20
< >
分享
最佳答案
0

正如Amedeo所说,你在STL多处用到了Point类,而且该类没有默认合成的构造函数,在执行遇到需要默认实例化该类时就会遇到如上编译错误。

你无法保证在定义STL模板类中何时会实例化你的自定义类,所以最好添加一个默认构造函数。

还有注意到,你注释掉的41行也是存在隐式漏洞的。

其一,你的默认构造函数没有了,默认的拷贝函数和赋值运算符重载也不存在。这里你使用了=运算符,而该定义确实不存在。

其二,你的参数是引用,那么赋值给map键值对中的对象的生命周期就移交给了它的定义语句所在作用域,也就是vector<Point>的地方,你的代码比较简单没有复杂的逻辑关系,但当你的代码复杂后,就无法保证map中是否存储了有效的数据,很可能已经销毁了的对象。

 

以上仅为个人看法,个人水平有限,可能存在疏漏,只是给你提示一下方向。谢谢

收获园豆:10
TearsOfDawn | 初学一级 |园豆:34 | 2018-06-17 08:01
其他回答(2)
0

其实在类中加一个无参数构造函数就行了,哎,笨死了

winslam | 园豆:188 (初学一级) | 2018-06-15 22:29
0

如果你不显式定义一个构造函数,它就会自己定义一个无参的默认构造函数;如果你定义了构造函数,编译器就不会自动给你定义构造函数了。

你的类中自己定义了一个有参构造函数,没定义无参构造函数,那么下面如果无参构造就不能通过了

Arthurian | 园豆:931 (小虾三级) | 2018-06-15 22:48

请问下,那个else,在什么情况下会执行?遍历完容器就会?不知道这个底层的作者是什么用意,他用的unordered_map中 键-值 类型: int 和 指向对象的shared_ptr

支持(0) 反对(0) winslam | 园豆:188 (初学一级) | 2018-06-15 22:59
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册