当我在cplusplus.com上阅读地图容器的参考时,我发现有5种方法可以使用它的构造函数。我理解如何使用空容器构造函数,范围构造函数,复制构造函数。 但是移动构造函数和初始化列表构造函数呢?
这是使用地图构造函数的示例。第四和第五是如何构建的以及它们的元素是什么。
// constructing maps
#include <iostream>
#include <map>
bool fncomp (char lhs, char rhs) {return lhs<rhs;}
struct classcomp {
bool operator() (const char& lhs, const char& rhs) const
{return lhs<rhs;}
};
int main ()
{
std::map<char,int> first;
first['a']=10;
first['b']=30;
first['c']=50;
first['d']=70;
std::map<char,int> second (first.begin(),first.end());
std::map<char,int> third (second);
std::map<char,int,classcomp> fourth; // class as Compare
bool(*fn_pt)(char,char) = fncomp;
std::map<char,int,bool(*)(char,char)> fifth (fn_pt); // function pointer as Compare
return 0;
}
答案 0 :(得分:2)
第四个构造函数重载是移动构造函数。移动语义基本上是一种从即将销毁的临时对象中窃取资源的方法。
如果您编写了一个返回std::map
的函数,并尝试通过返回值初始化一个新函数,如:
std:: map <char, int> f ();
map <char, int> new_map (f());
new_map
将从f
的结果移动构造。
你可以找到关于“右值参考”和“移动语义”here的精彩解释。
initializer-list 构造函数使用新的大括号初始化语法,可能如下所示:
std:: map <char, char> TranslationTable {{'G', 'C'}, {'C', 'G'},
{'T', 'A'}, {'A', 'T'}};