STL之关联式容器
map set multiset multimap
- 无序的(不是按照插入顺序)
- 已序的(按照key的顺序)
unordered_map unordered_set
- 基于 _Hash 实现
- 是一个
容器适配器 - 等同于boost::hash_map boost::hash_set
函数对象/仿函数
- 实现了
operator()的类
// 这就是函数对象
class FuncObj
{
public:
void operator()(int nNum)
{
std::cout << "This is a Function Object! Argment is [" << nNum << "]\n";
}
};
int main()
{
FuncObj fno;
fno(10);
return 0;
}应用
int RandNum()
{
return rand() % 5000;
}
int RandomNum(int nMax)
{
return rand() % nMax;
}
class RandNumber
{
public:
RandNumber(int nMaxNum) : nMaxNum_(nMaxNum) {}
int operator()()
{
return rand() % nMaxNum_;
}
private:
int nMaxNum_;
};
bool IsCopy(int nNum)
{
return n < 300;
}
int main()
{
std::vector<int> demo, other;
demo.resize(30);
other.resize(30);
// 方式1 利用函数
std::generate(demo.begin(), demo.end(), RandNum());
// 方式2 利用 函数对象
int nMaxNum = 0;
std::cin >> nMaxNum;
RandNumber fno(nMaxNum);
std::generate(demo.begin(), demo.end(), fno);
// 方式3 利用 bind
auto func = std::bind(RandomNum, nMaxNum);
std::generate(demo.begin(), demo.end(), func);
std::copy_if(demo.begin(), demo.end(), other.begin(), IsCopy);
return 0;
}bind
bind的主要目的是将不符合条件的函数对象或函数, 封装为符合算法调用规则的函数对象或函数.
#include <iostream>
#include <functional> // 使用bind
// 一个普通的函数
void Fun(int nVal1, int nVal2, int nVal3)
{
std::cout << nVal1 << " " << nVal2 << " " << nVal3 << std::endl;
}
// 声明一个函数指针
typedef void FunTwoIntPara(int, int);
int main()
{
// 将 Fun 变成 1个参数的 函数指针类型
// 注意, std::placeholders::_1占位表示传递进来的第一个参数
auto FunOneIntPara = std::bind(Fun, std::placeholders::_1, 20, 30);
FunOneIntPara(10);
// 结果为 10 20 30
// 将 Fun 变成 3个参数的 函数指针类型
// 注意, std::placeholders::_1占位表示传递进来的第一个参数
// 注意, std::placeholders::_2占位表示传递进来的第二个参数
// 生成的函数需传递两个参数
auto FunTwoIntPara = std::bind(Fun, std::placeholders::_1, std::placeholders::_2, 30);
FunTwoIntPara(10, 20);
// 结果为 10 20 30
FunTwoIntPara = std::bind(Fun, std::placeholders::_2, std::placeholders::_1, 30);
FunTwoIntPara(10, 20);
// 结果为 20 10 30
return 0;
}未完待续...
如有错误,请提出指正!谢谢.
本文由 花心胡萝卜 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: 2017-05-02 at 03:10 pm