第5章 C++STL泛化技术分析

/*

第5章 C++STL泛化技术分析
   5.1 算法和迭代器
   5.2 内存分配器和容器
   5.3 概念
   5.4 本章小结

第5章 C++STL泛化技术分析
   5.1 算法和迭代器
   5.1.1 算法
   5.1.2 迭代器
   5.1.3 函数对象
   5.1.4 适配器
   5.2 内存分配器和容器
   5.2.1 内存分配器
   5.2.2 容器
   5.3 概念
   5.3.1 基础性概念
   5.3.2 容器概念
   5.3.3 迭代器概念
   5.3.4 函数对象概念
   5.4 本章小结

*/

//第5章 C++STL泛化技术分析
//   5.1 算法和迭代器 ---------------------------------------------------------------------------------------------

//61
#include <algorithm>
#include <iostream>
int main(void)
{
  using namespace std;
  double a[8] = { 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0 }; //8个元素的数组
  double val = 3.0;
  double *result = find(a, a + 8, val); //等价于find(&a[0],&a[7]+1,val)
  if(result == a + 8)
    cout << "数组没有一个元素的值等于" << val << endl;
  else
    cout << "数组有一个元素值等于" << val << endl;
  return 0;
}

//66
#include <iostream>
#include <algorithm>
using namespace std;

struct print
{
  void operator()(int x)
  {
    cout << x << ‘ ‘;
  }
};

int main()
{
  int a[] = {68, 1, 17, 6, 3, 31, 6, 5, 30};
  const int length = sizeof(a) / sizeof(int);
  //对每个数组元素进行打印
  for_each(a, a + length, print());
  cout << endl;

  return 0;
}

// 70 ,与书中代码有所不同,改过了。
#include <iterator>
#include <iostream>
#include <vector>
int main(void)
{
  using namespace std;
  vector < int > v;
  v.push_back(3);
  v.push_back(6);
  v.push_back(9);
  vector<int>::reverse_iterator rfirst(v.end());
  vector<int>::reverse_iterator rend(v.begin());
  while(rfirst != rend)
  {
    cout <<  *rfirst << ‘ ‘;
    ++rfirst;
  }
  return 0;
}

//73
/*
前面说书不代码不对,可能说错了。bind可以绑定第一个参数,也可以绑定第二个参数
再来解读bind。
bool greater(T&x, T&y){return x>y;}
bind1st,是将常数值,绑定给greater的第一个参数,那么第二个参数就是*it,即引用的容器中的值。
以下程序,将常数7,绑定给greater的第一个参数x,那么return的是:
7>(*it)
那么容器中的小于7的数,将被首先找到。

将常数绑定到第一个参数,程序不容易阅读。所以bind2nd要比bind1st常用得多。
*/

#include <vector>
#include <iostream>
#include <algorithm>   //find_if算法
#include <functional>
int main(void)
{
  using namespace std;
  vector < int > v;
  v.push_back(20);
  v.push_back(13);
  v.push_back(6);
  v.push_back(3);
  v.push_back(29);
  vector < int > ::iterator less7_iter;
  less7_iter = find_if(v.begin(), v.end(), bind1st(greater < int > (), 7));
  cout <<  *less7_iter << endl; //将打印数字6
  return 0;
}

// my test
/*
直接用bind2nd,找小于7的数,要直观得多。
绑定,是将常数值,绑定给greater等二元函数对象的第一,或第二个参数。
如非特殊,绑定给第二个参数吧。
*/

#include <vector>
#include <iostream>
#include <algorithm>   //find_if算法
#include <functional>
int main(void)
{
  using namespace std;
  vector < int > v;
  v.push_back(20);
  v.push_back(13);
  v.push_back(6);
  v.push_back(3);
  v.push_back(29);
  vector < int > ::iterator less7_iter;
  less7_iter = find_if(v.begin(), v.end(), bind2nd(less<int>(),7));
  cout <<  *less7_iter << endl; //将打印数字6
  return 0;
}

//74。当然,不用函数对象,直接用函数,也是可以的。
#include <vector>
#include <iostream>
#include <algorithm>   //find_if算法
bool less7(int x)
{
  return x < 7;
}
int main(void)
{
  using namespace std;
  vector < int > v;
  v.push_back(20);
  v.push_back(13);
  v.push_back(6);
  v.push_back(3);
  v.push_back(29);
  vector < int > ::iterator less7_iter = find_if(v.begin(), v.end(), less7);
  cout <<  *less7_iter << endl; //将打印数字6
  return 0;
}

//   5.2 内存分配器和容器 ---------------------------------------------------------------------------------------------

//   5.3 概念 ---------------------------------------------------------------------------------------------

//   5.4 本章小结 ---------------------------------------------------------------------------------------------

// 这章有点解读源码的味道,不必细读。

TOP

时间: 2024-10-14 21:57:17

第5章 C++STL泛化技术分析的相关文章

第4章 C++STL泛型库概述

/* 第二篇 C++STL泛化技术基础 第4章 C++STL泛型库概述 4.1 C++STL的发展历程 4.2 C++STL的各种实现版本 4.3 C++STL的Visual C++编译 4.4 C++STL的体系结构 4.5 C++STL存在的一些问题 4.6 本章小结 第二篇 C++STL泛化技术基础 第4章 C++STL泛型库概述 4.1 C++STL的发展历程 4.2 C++STL的各种实现版本 4.2.1 HP STL 4.2.2 SGI STL 4.2.3 STLport 4.2.4

蓝牙协议分析(7)_BLE连接有关的技术分析

转自:http://www.wowotech.net/bluetooth/ble_connection.html#comments 1. 前言 了解蓝牙的人都知道,在经典蓝牙中,保持连接(Connection)是一个相当消耗资源(power和带宽)的过程.特别是当没有数据传输的时候,所消耗的资源完全被浪费了.因而,对很多蓝牙设备来说(特别是功耗敏感的设备),希望在无数可传的时候,能够断开连接.但是,由于跳频(hopping)以及物理通道(Physical Channel)划分的缘故,经典蓝牙连接

蓝牙4.0技术分析1-广播者角色

第1章  BlueTooth Roles-Broadcaster 1.1    广播类型 广播可设置以下几种类型: 1)   Connectable Undirected Event Type(可连接无定向广播) 2)   Connectable Directed Event Type(可连接定向广播) 3)   Scannable Undirected Event Type(可扫描无定向广播) 4)   Non-connectable Undirected Event Type(不可连接无定向

STL源码分析--仿函数 &amp; 模板的模板参数 &amp; 临时对象

STL源码分析-使用的一些特殊语法 关于泛型编程中用到的一些特殊语法,这些语法也适用于平常的模板编程 1.  类模板中使用静态成员变量 Static成员变量在类模板中并不是很特殊,同时这个变量不属于对象,属于实例化以后的这个类类型.每一个实例化对应一个static变量 2.  类模板中可以再有模板成员 3.  模板参数可以根据前一个模板参数而设定默认值 4.  类模板可以拥有非类型的模板参数 所谓非类型的模板参数就是内建型的模板参数 Template <class T,class Alloc =

Fabric 和 Sawtooth 技术分析(下)

http://blog.talkingdata.com/?p=6172 在前一篇文章(Fabric和Sawtooth技术分析(上))中,我们着重跟大家分享了 Fabric 相关的内容,在本篇文章中,我们将围绕着 Sawtooth 进行一些分析和探讨. Sawtooth 结构及分析Sawtooth 是 Intel 公司推出的企业级区块链,2018年 Intel 将其贡献给 Hypherlegder 项目.本文中笔者主要从 Sawtooth 的存储结构.数据结构.网络结构方面做简要介绍. Sawto

stl源码分析之hash table

本文主要分析g++ stl中哈希表的实现方法.stl中,除了以红黑树为底层存储结构的map和set,还有用哈希表实现的hash_map和hash_set.map和set的查询时间是对数级的,而hash_map和hash_set更快,可以达到常数级,不过哈希表需要更多内存空间,属于以空间换时间的用法,而且选择一个好的哈希函数也不那么容易. 一. 哈希表基本概念 哈希表,又名散列表,是根据关键字直接访问内存的数据结构.通过哈希函数,将键值映射转换成数组中的位置,就可以在O(1)的时间内访问到数据.举

stl源码分析之list

本文主要分析gcc4.8版本的stl list的源码实现,与vector的线性空间结构不同,list的节点是任意分散的,节点之间通过指针连接,好处是在任何位置插入删除元素都只需要常数时间,缺点是不能随机访问,查询复杂度是O(n),n为list中的元素个数.所以list非常适合应用与数据插入删除频繁的场景. 一. list节点 list节点定义如下, struct _List_node_base { _List_node_base* _M_next; _List_node_base* _M_pre

3DSMAX建模技术分析

在游戏美术中,模型的建立是很重要的,今天卡拉小编与大家分享的是3DSMAX建模技术分析1 旋转建模 用于具有中心对称的物体的造型比较简单,只需用工 具画出对称截面,加入(旋转)修改器就可以得到三维实体,有些还可以加入一些特殊变形,以增强表现的效果.2 Loft放样建模 这种建模的含义是将一个二维的交错物件转换为完整的三维物件的一个处理过程,也就是将一个二维的造型物件沿着第三轴向构建出复杂曲面的模型.也可以这样理解这个过程:将许多2D(shape)造型物件紧密且整齐地排列于一条路经(path)上,

PLSQL_R12 MOAC多组织底层技术实现技术分析(Oracle VPD)

  2014-05-30 BaoXinjian In Capgemini  一. 介绍 之前一直存在对Oracle R12 多组织访问的一些疑惑,所以查询了一些相关资料,并介绍实现R12 MOAC的Oracle VPD技术 Oracle VPD全称Virtual Private Database, Oracle的一种控制数据访问的其中安全策略之一 Oracle数据安全策略访问实现方法 Role-based security create role cust_role; grant select