您的位置:首页 > 其它

20170423STL017_STL_hash容器

2017-04-24 22:37 155 查看

课程回顾:

    1:set和map的逻辑是通过红黑自平衡二叉树来完成的,呀里面所有的数据都是已序的,已序的东西进行查找是非常快的。

    2:已序:

        1:存入空间已序:访问速度为O1,直接就可以访问

        2:数据值已序:通过二分法来查找,做不到O1,但是还是会很快。

    3:set,map都是容器适配器,非序的set和map也是容器适配器(unordered_map,unordered_set)。

hash容器:

    1:根据对象产生一个数值,不同对象生成的哈希值可能是一样的,我们就把这些一样的放在一个空间里面(可以使vector里面放list,list里面存储这些值一样的对象),

    2:当vector里面一个元素(单个list)里面的元素大于vector总长度的时候,就增加vector桶数量(大小一般为质数,以保证数据更均匀)。vector称为一个哈希桶,vector的size就是其桶的数量。
    3:一般得出的值为:数据%size。得到的余数为几,就放在vector的哪个空间里面。如果一个list里面的元素超过vector的大小的时候,就可能导致查找效率降低,我们就需要增加vector的桶(质数个)。
    4:哈希容器里面的数据并不是按照大小顺序排列的,而是由其他方式排列,他的查找速度也会比较快。

仿函数(函数对象):

    1:重在了()的类就称为仿函数。重载括号后,由这个类生成的对象可以当成函数一样的调用。
class FunDemo
{
public:
void operator()()
{
std::cout << "函数对象" << std::endl;
}
private:
int num;
};


    2:他方便于我们在函数和类的基础上进行扩充。比如:我们需要在vector里面放小于100的随机数:
int RandNum()//如果项目需求,这里不允许传递参数
{
return rand() % 100;
}
int main()
{
std::vector<int> idemo;
idemo.resize(100);
std::generate(idemo.begin(), idemo.end(), RandNum);

return 0;
}


    当我们存入的不是100以内,而是按用户输入的来决定,而生成数据的函数有不让传参数,除了用全局变量,还可以使用函数对象来实现。 类里面可以存放数据,同时重载了括号的操作,满足上面的要求,重载了()的类,在使用的时候和普通的类是一样,其对象还可以当作函数使用。

bind:

    1:bind就是来做一个函数,可以绑定一些参数到原来的函数,生成新的参数较少的函数。
void Fun(int a1, int a2, int a3)
{
std::cout << a1 << "   " << a2 << "   " << a3 << std::endl;
}

typedef void FunType(int, int);
int main()
{

auto Fun1 = std::bind(Fun, std::placeholders::_1, 20, 30);//代表空的参数为第一个参数
Fun1(10);//打印 10  20  30

auto Fun2 = std::bind(Fun, std::placeholders::_1, std::placeholders::_2, 30);
//代表生成的函数需传递两个参数,这两个参数代替了原来函数的前两个参数
Fun2(10, 20);//打印 10  20  30

auto Fun3 = std::bind(Fun, 10, std::placeholders::_2, std::placeholders::_1);
//代表生成的函数需传递两个参数,这两个参数代替了原来函数的第三个,第二个参数,
Fun3(20, 30);//打印 10  30  20

auto Fun4 = std::bind(Fun, std::placeholders::_1, 20, std::placeholders::_2);
//代表生成的函数需传递两个参数,这两个参数代替了原来函数的第一个,第三个参数
Fun4(10, 30);//打印 10  20  30

auto Fun5 = std::bind(Fun, 10, std::placeholders::_1, 30);//代替原来第二个参数
Fun5(20);//打印 10  20  30

return 0;
}


    2:std::placeholders::_1在std::bind函数里面的第几个参数位置就代表会代替原来函数的第几个参数,后面数字是多少就代表生成的函数的第几个参数替换在这个地方。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  stl 迭代器