地图构造函数如何以类比较的形式使用?

时间:2015-03-01 02:52:46

标签: c++ dictionary constructor

当我在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;
}

1 个答案:

答案 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'}};