Effective STL--3. Associating Container

19. 理解相等和等价的区别

优先使用容器的成员函数进行查找

  if(!(w1 < w2)&&!(w2 < w1)){}//为真时表示关系等价
    
  set<string, CIStringCompare> ciss;//CIStringCompare 不区分字母大小写
  ciss.insert("Persephone");
  ciss.insert("persephone");//没有新元素插入

  if(ciss.find("persephone")!=ciss.end()){}//查找成功
  if(find(ciss.begin(), ciss.end(), "persephone")!=ciss.end()){}//查找失败
20. 为包含指针的关联容器指定比较类型

  set<string*> ssp;
  //set<string*, less<string*>, allocator<string*>> ssp;

  struct StringPtrLess:public binary_function<const string*, const>
  {
    bool operator()(const string *ps1, const string *ps2)const
    {
      return *ps1 < *ps2;
    }
  };
  set<string*, StringPtrLess> ssp;

21.总是让比较函数在等值的情况下返回false

equal_range 找不到相应的值,判断规则是

  if(!(w1 < w2)&&!(w2 < w1)){}//为真时表示关系等价

22. 切勿直接修改set或multiset中的键

map和multimap中的元素是const

  map<int, string> m;
  //....
  m.begin()->first = 10;//键值不能修改
  multimap<int, string> mm;
  //...
  mm.begin()->first = 20;//键值不能修改
set和multiset中的元素不是const,这是为了具体的应用,如下

  struct IDNumberLess:
    :public binary_function<Employee, Employee, bool>
  {
    bool operator()(const Employee& lhs, const Employee& rhs)const
    {
      return lhs.idNumber() < rhs.idNumber();
    }
  };
  typedef set<Employee, IDNumberLess> EmpIDSet;
  EmpIDSet se;
  Employee selectedId;

  EmpIDSet::iterator i = se.find(selectId);
  if(i!=se.end())
  {
    i->setTitle("Corporate Deity");//有些编译STL认为不合法
  }
如果某些STL无法实现上述方法,则采用通用的方法,先查找到相应的元素迭代起,然后删除,同时插入新的值代替刚才删去的

  if(i!=se.end())
  {
    Emplyee e(*i);
    e.setTitle("Corporate Deity");
    se.erase(i++);
    se.insert(i, e);
  }
23. 考虑用排序的vector代替关联容器

1. 设置阶段

2. 查找阶段

3.重组阶段

  vector<Widget> vw;
  sort(vw.begin(), vw.end());
  Wiget w;
  if(binary_search(vw.begin(), vw.end(), w)){}//binary_search 返回bool确定该值是否存在

  vector<Widget>::iterator i = lower_bound(vw.begin(), vw.end(), w);
  if(i!=vw.end() &&!(w<*i)){}

  pair<vector<Widget>::iterator, vector<Widget::iterator> range = equal_range(vw.begin(), vw.end(), w);
  if(range.first != range.second)
24.当效率至关重要时,请在map::operator[]与map::insert之间谨慎做选择

  map<int, Widget> m;
  typedef map<int, Widget> IntWidgetMap;
  m[1] = 1.50;//效果等通insert
  m.insert(IntWidgetMap::value_type(1, 1.50));//相比节省三个函数调用
25. 熟悉非标准的哈希容器


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值