empalce系列函数通过直接构造对象的方式避免内存拷贝和移动; 无序容器在插入元素时不排序,提升了插入效率,但是如果关键字是自定义的需要提供hash函数和比较函数
struct A{int x;double y;A(int a,double b):x(a),y(b){}};int main(){std::vector<A> v;v.emplace_back(1,2);std::cout<<v.size()<<std::endl;return 0;}
struct A{int x;double y;std::string z;A(int a,double b,std::string c):x(a),y(b),z(c) {std::cout<<"is constructed"<<std::endl;}A(const A &otherA):x(otherA.x),y(otherA.y),z(std::move(otherA.z)){std::cout<<"is moved"<<std::endl;}};int main(){std::vector<A> v;std::cout<<"------emplace_back:---------"<<std::endl;v.emplace_back(1,2,"helloword");std::cout<<"------push_back:---------"<<std::endl;v.push_back(A(3,4,"china"));return 0;}
运行结果如下:
------emplace_back:---------is constructed------push_back:---------is constructedis movedis moved
2 无序容器
struct Key{std::string first;std::string second;};struct KeyHash{std::size_t operator() (const Key &k) const{return std::hash<std::string>() (k.first)^(std::hash<std::string>() (k.second) << 1);}};struct KeyEqual{bool operator()(const Key &lhs,const Key &rhs) const {return lhs.first==rhs.first && lhs.second == rhs.second ;}};int main(){//定义一个空的无序mapstd::unordered_map<std::string,std::string> mymap1;//初始化std::unordered_map<std::string,double> mymap2 = {{"mom",5.4},{"dad",6.1},{"bro",5.9} };//拷贝构造std::unordered_map<std::string,double> mymap3 = mymap2;//移动构造std::unordered_map<std::string,double> mymap4 = std::move(mymap2);//区间构造std::vector<std::pair<std::string,double> > v = {{"cpp",1},{"java",2}};std::unordered_map<std::string,double> mymap5(v.begin(),v.end());std::unordered_map<std::string,double> mymap7(mymap2.begin(),mymap2.end());//自定义无序容器std::unordered_map< Key,std::string,KeyHash,KeyEqual> mymap6={{ {"cpp","top"},"one"},{ {"java","top"},"two"}};return 0;}
从上面的代码可以看出,无序容器的用法和有序容器在使用上基本没有什么区别。
- EOF -
文章转载自CPP开发前沿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




