PoEdu培训 STL班 第十八课 STL源码解析之Hash实现的关联式容器
文章类别: 培训笔记 0 评论

PoEdu培训 STL班 第十八课 STL源码解析之Hash实现的关联式容器

文章类别: 培训笔记 0 评论

STL之关联式容器

map set multiset multimap

unordered_map unordered_set

函数对象/仿函数

// 这就是函数对象
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;
}

未完待续...

如有错误,请提出指正!谢谢.

回复