第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 P.J.Plauger STL
   4.2.5 Rouge Wave STL
   4.3 C++STL的Visual C++编译
   4.4 C++STL的体系结构
   4.4.1 容器(Container)
   4.4.2 迭代器(Iterator)
   4.4.3 算法(Algorithm)
   4.4.4 函数对象(Function Object)
   4.4.5 适配器(Adapter)
   4.4.6 内存分配器(Allocator)
   4.4.7 概念(Concept)和模型(Model)
   4.5 C++STL存在的一些问题
   4.6 本章小结

*/

//   第4章 C++STL泛型库概述
//   4.1 C++STL的发展历程 ---------------------------------------------------------------------------------------

//   4.2 C++STL的各种实现版本 ---------------------------------------------------------------------------------------

//   4.3 C++STL的Visual C++编译 ---------------------------------------------------------------------------------------

// 51
#include <vector>
#include <iostream>
#include <string>
int main(void)
{
  using namespace std;
  vector < string > vec;
  vector < string > ::const_iterator i;
  vec.push_back("dog");
  vec.push_back("bird");
  vec.push_back("girl");
  vec.push_back("boy");
  vec.push_back("Hello,there");
  for(i = vec.begin(); i != vec.end(); ++i)
  {
    cout << (*i) << endl;
  }
  return 0;
}

//   4.4 C++STL的体系结构 ---------------------------------------------------------------------------------------

// 54
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int main(void)
{
  vector<int> v;
  v.push_back(6);
  v.push_back(8);
  v.push_back(31);
  vector<int>::iterator result=
    find(v.begin(),v.end(),8);
  cout << *result << endl;

  return 0;
}

//55
// bind1st(not_equal_to<int>(),0)
template <class Operation> class binder1st: public unary_function
  <typename Operation::second_argument_type, typename Operation::result_type>
{
  protected:
    Operation op;
    typename Operation::first_argument_type value;
  public:
    binder1st(
    const _Operation &x, const typename Operation::first_argument_type &y)
      : op(x), value(y){} // 构造函数。not_equal_to->op  0->value
    typename Operation::result_type operator()
      (const typename _Operation::second_argument_type &x)const
    {
        return op(value, x); // 0 not_equal_to x
    }
};   

// my test, bind
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int main(void)
{
  vector<int> v;
  v.push_back(1);
  v.push_back(10);
  v.push_back(20);

  size_t i=count_if(v.begin(),v.end(),
    bind2nd(less_equal<int>(),10)); // <=10的数有几个?2个
  cout << i << endl;

  return 0;
}

// my test ,bind2nd
// 可见书中的例子是错的。bind1st(not_equal_to<int>(),0),不对。value,应该在第一个位置
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int main(void)
{
  vector<int> v;
  v.push_back(1);
  v.push_back(10);
  v.push_back(20);

  size_t i=count_if(v.begin(),v.end(),
    bind2nd(not_equal_to<int>(),10)); // !=10的数有几个?2个
  cout << i << endl;

  return 0;
}

/*
c++ primer
14.8. 调用操作符和函数对象
标准库定义了两个绑定器适配器:bind1st 和 bind2nd。每个绑定器接受一个函数对象和一个值。
正如你可能想到的,bind1st 将给定值绑定到二元函数对象的第一个实参,bind2nd 将给定值绑定到二元函数对象的第二个实参。

标准库还定义了两个求反器:not1 和 not2。你可能已经想到的,not1 将一元函数对象的真值求反,not2 将二元函数对象的真值求反。
这里,首先将 less_equal 对象的第二个操作数绑定到 10,实际上是将该二元操作转换为一元操作。
*/

#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int main(void)
{
  vector<int> v;
  v.push_back(1);
  v.push_back(10);
  v.push_back(20);

  size_t i=count_if(v.begin(),v.end(),
    not1(bind2nd(not_equal_to<int>(),10))); // 不是!=10的数有几个?1个
  cout << i << endl;

  return 0;
}

//   4.5 C++STL存在的一些问题 ---------------------------------------------------------------------------------------

//   4.6 本章小结 ---------------------------------------------------------------------------------------

TOP

时间: 2024-10-09 23:17:42

第4章 C++STL泛型库概述的相关文章

泛型算法概述

顺序容器只定义了很少的操作:在多数情况下,我们可以添加和删除元素.访问首尾元素.确定容器是否为空以及获得指向首元素或尾元素之后位置的迭代器. 如果我们想要做:查找特定元素.替换或删除一个特定值.重排元素顺序等.标准库并未给每个容器都定义成员函数来实现这些操作,而是定义了一组泛型算法:称它们为“算法”,是因为它们实现了一些经典算法的公共接口,如排序和搜索:称它们是“泛型的”,是因为它们可用于不同类型的元素和多种容器类型(不仅包括标准库类型,如vector或list,还包括内置的数组类型). 概述

参考C++STL标准库中对了的使用方法

http://www.cppblog.com/zhenglinbo/archive/2012/09/18/191170.html 参考:http://www.cppblog.com/zhenglinbo/archive/2012/09/18/191170.html 当然是使用c++中的STL 的queue啦.下面简要介绍一下使用方法. 1 准备工作 头文件 #include<queue> 2 声明和定义的方法.STL的队列是泛型模板,支持任何内置和构造类型. 比如对于刚才那个牛奶问题.我把状态

C++标准库概述 [转]

C++标准库的所有头文件都没有扩展名. C++标准库的内容总共在50个标准头文件中定义,其中18个提供了C库的功能.<cname>形式的标准头文件[<complex>例外]其内容与ISO标准C包含的name.h头文件相同,但容纳了C++扩展的功能.在<cname>形式标准的头文件中,与宏相关的名称在全局作用域中定义,其他名称在std命名空间中声明.在C++中还可以使用name.h形式的标准C库头文件名. C++标准库的内容分为10类: C1.语言支持 :   C2.输入

程序设计语言-标准库概述

1 认识标准库 没有任何一个重要程序只用某种赤裸裸的程序设计语言写出的:首先总要开发出一组支持库,这也形成了进一步工作的基础. 2 第一个程序 #include<iostream>  //指编译器包含位于iostream里的标准流I/O功能的声明 int main() //定义一个main()函数,该函数没有参数,也不做任何事情 { std::cout<<"hello,world!\n"; //字符串文字量"hello,world!\n"将被

STL标准库-容器-set与multiset

摘要: 技术在于交流.沟通,转载请注明出处并保持作品的完整性. set与multiset关联容器 结构如下 set是一种关联容器,key即value,value即key.它是自动排序,排序特点依据key set的key不能相同.multiset的key相同.关联容器的查找效率要高于顺序容器很多很多. set和multiset不提供用来直接存取元素的任何操作函数,取值需要通过迭代器 一 定义 1.set/mulitiset以红黑树为底层结构,因此有元素自动排序的特性,排序是根据key,而set.m

----堆栈 STL 函数库 ----有待补充

#include<cstdio> #include<string> #include<vector> #include<iostream> using namespace std; int main() { vector<int> a; int i,b; for(i=0;i<56;i++) a.push_back(i); printf("%d",a.size()); a.resize(10); for(i=0;i<

【STL】帮你复习STL泛型算法 一

STL泛型算法 #include <iostream> #include <vector> #include <algorithm> #include <iterator> #include <numeric> #include <list> using std::cout; using std::endl; using std::vector; using std::list; bool IsOushu(const int&

STL标准库-容器-rb_tree

摘要: 摘要: 技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 红黑树,关联式容器底层实现(map set),在使用中基本运用不到,但是还是想了解一下他的运作方式 Red_Black tree是平衡二分搜寻树(balanced binary search tree),它是高度平衡的二叉树,这样有利于search和insert. 红黑树提供遍历,如果如果按正常规则(++iter)遍历,便能获得排序状态 如上图,你会发现返回迭代器头的begin()函数指向的是"5"

【转】Struts1.x系列教程(4):标签库概述与安装

转载地址:http://www.blogjava.net/nokiaguy/archive/2009/01/archive/2009/01/archive/2009/01/archive/2009/01/15/251411.html Struts的整个视图层(就是MVC模式中的View层)是由Struts的定制标签(或者称为定制动作)和客户端代码(Javascript.HTML等)实现的.这些Struts标签被写在JSP页面中,用于生成客户端代码.进行逻辑判断等工作,使用Struts标签可以尽量