STL之set map 和multiset multimap理解
1.set multiset底层及区别? 都是由二叉搜索树(红黑树实现),不同在于multiset允许键值冗余。
2.map 和 multimap底层及区别? 都是由红黑树实现,不同在于multimap允许键值冗余
3.set和map的区别? set是<key, key> map是<key, value>
4.map的[]运算符重载是怎样的? 逻辑分三步 第一步 调用insert函数插入键值对 第二步 拿出insert返回的迭代器 第三步 从拿到的迭代器中取到value值
函数原型 mapped_type& operator[] (const key_type& k); 函数返回值 (*(this->make_pair(k, mapped_type())).first)).second 具体代码 mappd_type& operator[] (const key_type& k) { pair<iterator, bool> ret = insert(make_pair(k, mapped_type())); 第一步 调用insert函数插入键值对 第二步 拿出insert返回的迭代器 itertor it = ret.first; 第三步 从拿到的迭代器中取到value值 return it->second; }
5.什么时候用“.” 什么时候用“->”? A a; A* p = &a 是类的对象指针或者结构体指针使用-> p->_years 而.的使用包含了-> , (**P).set( ) 一个 简单地认为“->”的左边是一个指针过于简单了。这个符号是用来代替*和.的合成,因为一般情况下通过“指针”访问结构体或对象成员,是“先求值,再取分量”,即上述的(*p).set( ),因为用两个符号过于麻烦,所以才使用“->”来代替,这样直观、简单得多。
6.map的插入函数原型以及使用代码? 函数原型 pair<iterator,bool> insert (const value_type& val); value_type就是pair类型 方式一:调用pair的构造函数,构造一个匿名对象插入 map<int, string> m; m.insert(pair<int, sting>(2,“two”));
方式二调用make_pair函数模板插入 template <class T1, class T2> pair<T1, T2> make_pair(T1 X, T2 Y) { return (pair<T1, T2>(X, Y)); } m.insert(make_pair(2, “two”));