标准模板库用法介绍

标准模板库的内容

  • 标准模板类:复数、序偶
  • 迭代器
  • 标准容器:向量、表、栈、堆、队列、集合、映射等
  • 标准算法:查找、排序等

标准模板库型式的使用方法

  • <>模板名称<数据对象基型式> 数据对象名称;
  • 示例一:Complex<double> a(1.0, 2.0);
  • 示例二:pair<string,string> name("Zhang", "san");
  • 示例三:vector<int> v(8);

复数 类模板

一般说明

  • 头文件:"complex"
  • 模板名:complex<>
  • 基型式:float、double、long double
  • 首选doublefloat精度太低,long double已废弃

实部与虚部

  • 成员函数realimag()

复数操作

  • 复数的全部操作均可以按照数学格式进行
  • coutcin均已重载:格式为(real, imag)

序偶 模板类

一般说明

  • 头文件:"utility"
  • 模板类:pair<>
  • 用于表示总是成对出现两个对象
  • 示例一:pair<int, double> a(1, 1.0);
  • 示例二:pair<string, string> name("Zhang", "San");

使用规则

  • 公开的数据成员:firstsecond
  • 示例:cout << name.fisrt << "," << name.second;
  • 序偶比较:先比较first大小,相同时比较second大小
  • make_pair:构造序偶的辅助函数
  • 示例:pair<int, double> a; a = make_pair(1, 1.0);

向量模板类

向量的目的

  • 替代数组,可以像数组一样使用向量

向量的使用

  • 格式定义:vector<int> v(8);// 包含8个整数元素
  • operator[]:已重载,使用格式v[i]访问第i个元素
  • 向量可以整体赋值
  • size():返回向量中元素数目
  • capacity():返回向量当前可存储的最多元素数目
  • clear():删除向量所有元素,但不释放向量本身
  • resize(int newsize):重新设置向量容量

补充:随机数接口

头文件声明

// Random.h
void Randomize();
int GenerateRandomNumber(int low, int high);
double GenerateRandomReal(double low, double high);

实现随机数库

#include <iostream>
#include <cstdlib>  // 这里包含srand()
#include <ctime>

#include "Random.h"
using namespace std;
void Randomize()
{
    srand((int)time(NULL));
}

int GenerateRandomNumber( int low, int high)
{
    double _d;
    if( low > high)
    {
        cout << "GenerateRandomNumber: Make sure low <= high.\n";
        exit(1);
    }
    _d = (double)rand() / (RAND_MAX + 1.0);
    return (low + (int)(_d * (high - low + 1)));
}

double GenerateRandomReal( double low, double high)
{
    double _d;
    if(low > high)
    {
        cout << "GenerateRandomReal: Make sure low <= high.\n";
        exit(2);
    }
    _d = (double)rand() / (double)RAND_MAX;
    return (low + _d * (high - low));
}

测试

#include <iostream>
#include "Random.h"
using namespace std;

int main(){
    int i;
    Randomize();
    for( i = 0; i < 8; ++i){
        int t =  GenerateRandomNumber(10,99);
        cout << t << ";";
    }
    cout << endl;

    for(i = 0; i < 8; ++i){
        double d = GenerateRandomReal(10.0, 99.0);
        cout << d << ";";
    }
    cout << endl;

    return 0;
}

// 测试结果如下:
12;90;43;51;89;42;85;58;
98.9864;77.336;16.3992;74.9621;42.1728;89.8765;77.1567;11.4559;

迭代器

注意:没有必要搞清楚迭代器究竟是啥?不同容器的迭代器实现形式可能不同,即便是同一种容器的迭代器,也可能有多种实现迭代器的方式。只需要明白它有像指针一样的特性,使用很方便即可。

迭代器的性质

  • 通过迭代器访问容器中的数据对象
  • 类似指针、数组索引的功能:通过指针加减与数组下标算法获取下一数据对象
  • 迭代器可以是指针,但并不必须是指针,也不必总是使用数据对象的地址

迭代器的典型使用方法

  • 声明迭代器变量
  • 使用引领操作符访问迭代器指向的当前目标对象
  • 使用递增操作符获取下一对象的访问权
  • 若迭代器新值超出容器的元素范围,类似指针变成NULL,目标对象不可引用

迭代器的分类

  • 输出迭代器:提供对象的只读访问
  • 输出迭代器:提供对象的只写访问
  • 前向迭代器:提供对象的正向(递增)读写访问
  • 双向迭代器:提供对象的正向与反向(递增递减)读写访问
  • 随机访问迭代器:提供对象的随机读写访问

指针作为迭代器

调用标准模板库的find()函数查找数组元素

#include <iostream>
#include <algorithm>
using namespace std;
const int size = 16;
int main()
{
    int a[size];
    for(int i = 0; i < size; ++i)
        a[i] = i;
    int key = 7;
    int * ip = find(a, a + size, key);
    if(ip == a + size) // 不要使用NULL做指针测试,直接使用过尾值
        cout << key << " not found." << endl;
    else
        cout << key << " found." << endl;
    return 0;
}

使用迭代器操作向量

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
    int key = 7;
    vector<int> iv(10);
    for(int i = 0; i < 10; i++)
        iv[i] = i;
    // 下面一句就是在定义迭代器对象
    vector<int>::iterator it, head = iv.begin(), tail = iv.end();
    it = find( head, tail ,key );
    if(it != tail)
        cout << "Vector contains the value" << key << endl;
    else
        cout << "Vector does NOT contain the value" << key << endl;
    return 0;
};

常迭代器

  • 若不想通过迭代器修改目标对象值,定义迭代器常量

示例

  • const vector<int>::iterator it;
  • 非法操作:*it = 10;// 不能修改常迭代器指向的对象

流迭代器

使用迭代器访问流

  • 将输入输出流作为容器

使用方式:定义流迭代器对象

  • 示例一:ostream_iterator<int> oit(cout, " "); // 将 oit 迭代器和 cout 绑定在一块,输出的两元素之间用空格" "隔开
  • 示例二(从cin获取数据):istream_iterator<int> iit(cin);
  • 示例三(使用空指针创建流结束迭代器):istream_iterator<int> iit;
  • 凡是可以出现迭代器参数的标准算法都可以使用

示例:输出流迭代器

#include <iostream>
#include <iterator>
#include <algorithm>
#include "random.h"
using namespace std;
const int size = 8;
const int lower_bound = 10;
const int upper_bound = 99;

void Display( vector<int> & v, const char * s)
{
    cout << endl << s << endl;
    vector<int>::iterator head = v.begin(), tail = v.end();
    
    // 输出流迭代器实际是是指向输出流容器,所以数据向输出流里面一拷贝,这个数据就是到屏幕上
    // 拷贝一个,输出一个,中间是用逗号分开的
    ostream_iterator<int> oit(cout, ";"); // oit是迭代器名称,可以随便起
    copy(head, tail, oit);
    cout << endl;
}

int main()
{
    vector<int> a(size);
    for(int i = 0; i < size; ++i)
        a[i] = GenerateRandomNumber(10, 99);
    Display(a, "Array generated:");
    vector<int>::iterator head = a.begin(), tail = a.end();
    sort(head, tail);  // 只要该容器支持迭代器,sort都可以进行排序,缺省排序是从小到大
    Display(a, "Array sorted:");
    reverse(head, tail);
    Display(a, "Array reversed:");
    return 0;
}

示例:输入流迭代器

#include <iostream>
#include <iterator>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
    vector<int> v(4);
    vector<int>::iterator it = v.begin();
    cout << "Enter 4 ints separated by spaces & a char:\n";
    // head 就是迭代器,和cin绑定;tail空迭代器,表示输入流的结尾
    istream_iterator<int> head(cin), tail; 
    copy(head, tail, it);
    cin.clear();
    cout << "vector = ";
    for(it = v.begin(); it != v.end(); ++it)
        cout << *it << " ";
    cout << endl;
    return 0;
}

模板库中的表实际上是双向列表

表的使用

  • 定义包含Point对象的容器:list<Point> pts(8);
  • 插入:pts.insert(pts.begin(), Point(1, 2));
  • 表头插入:pts.push_front(Point(1, 2));
  • 插入:pts.insert(pts.end(), Point(1, 2));
  • 表尾插入:pts.push_back(Point(1, 2));
  • 定义包含Point 指针的容器:list<Point*> ppts(8);
  • 插入:ppts.insert(ppts.begin(), new Point(1, 2));
  • 插入:ppts.insert(ppts.end(), new Point(1, 2));
  • 删除:delete ppts.front(); ppts.remove( ppts.front());
  • 判断是否为空:if(pts.empty()) cout << "Empty!";

表与迭代器

  • 迭代器可以和表协同工作,方式与向量相同

    list<int> a(8);
    list<int>::iterator it;
    for( it = a.begin(); it != a.end(); ++it)
        *it = GenerateRandomNumber(10, 99);
    

    表排序

    • 直接使用表的成员函数:a.sort();// 默认升序
    • 降序排序之一:升序排序后调用成员函数reverse()
    • 降序排序之二:传入函子greater_equal<int>()
      a.sort(greater_equal<int>());
    • 对于自定义对象,需要重载operator <以进行比较

标准算法

  • 查找算法
  • 排序算法
  • 删除和替换算法
  • 排列组合算法
  • 算术算法
  • 关系算法
  • 集合算法
  • 生成和变异算法
  • 堆算法

共提供了84个抽象算法

标准函子

算术函子

  • plus<T> 加
    minus<T> 减
    multiplies<T> 乘
    divides<t> 除
    modulus<T> 取模
    negate<T> 取负
    

关系函子

  • equal_to<T> 等于
    not_equal_to<T> 不等于
    greater<T> 大于
    great_equal<T> 大于等于
    less<T> 小于
    less_equal<T> 小于等于
    

逻辑函子

  • logical_and<T> 逻辑与
    logical_or<t> 逻辑或
    logical_not<T> 逻辑非
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一份讲解全面的标准模板STL学习资料 标准模板STL主要由6大组件组成: (1)容器(Containers)。包括各种基本数据结构的类模板。 STL容器部分主要由头文件<vector>、<list>、<deque>、<set>、< map>、<stack>和<queue>组成。 (2)算法(Algorithms)。包括各种基本算法,如比较、交换、查找、排序、遍历操作、复制、修改、移除、反转、合并等等。 STL算法部分主要由头文件<algorithm>和<numeric>组成。 (3)迭代器(Iterators)。迭代器是面向对象版本的指针,如同指针可以指向内存中的一个地址,迭代器可以指向容器中的一个位置。 STL的每一个容器模板中,都定义了一组对应的迭代器类,用以存取容器中的元素。这样,在STL中迭代器就将算法容器联系起来了,通过迭代器算法函数可以访问容器中指定位置的元素,而无需关心元素的具体类型。 STL迭代器部分主要由头文件<utility>和<iterator>组成。 (4)函数对象(Function Objects)。一种行为类似于函数的class,实现技术上是一个改写了“call operator()”的class。 STL 提供 15 个预定义的 Function objects。头文件<functional>中定义了一些类模板,用以声明函数对象。 (5)适配器(Adaptors)。简单地说就是一种接口类,专门用来修改现有类的接口,提供一种新的接口;或调用现有的函数来实现所需要的功能。 主要包括3种适配器Container Adaptors、Iterator Adaptors与Function Adaptors。其中迭代器适配器的定义在头文件<iterator>中,函数适配器的定义在头文件<functional>中。 (6)内存配置器(Allocators)。为STL提供空间配置的系统。 头文件<memory>中的主要部分是模板类allocator,它负责产生所有容器中的默认分配器。容器使用allocator完成对内存的操作,allocator提供内存原语以对内存进行统一的存取。
1 STL 简介 ..............................................................................................................................................2 2 顺序性容器...........................................................................................................................................2 2.1 C++ VECTOR(向量容器) ...........................................................................................................2 2.2 C++ LIST(双向链表) .................................................................................................................4 2.3 C++ DEQUE(双向队列) ..................................................................................................................6 2.4 三者比较........................................................................................................................................8 3 关联容器...............................................................................................................................................8 3.1 特点................................................................................................................................................8 3.2 C++ SETS & MULTISETS .................................................................................................................9 3.3 C++ MAPS & MULTIMAPS ............................................................................................................ 11 4 容器适配器.........................................................................................................................................12 4.1 特点..............................................................................................................................................12 4.2 C++ STACKS(堆栈) ..................................................................................................................13 4.3 C++ QUEUES(队列) ......................................................................................................................13 4.4 C++ PRIORITY QUEUES(优先队列)...............................................................................................13 5 迭代器.................................................................................................................................................14 5.1 解释..............................................................................................................................................14 5.2 功能特点......................................................................................................................................14 6 C++标准总结..................................................................................................................................15 6.1 容器..............................................................................................................................................15 6.2 算法..............................................................................................................................................15 6.3 函数对象......................................................................................................................................17 6.4 迭代器..........................................................................................................................................19 6.5 分配器..........................................................................................................................................19 6.6 数值..............................................................................................................................................19
### 回答1: C++ 标准模板(STL)是一个强大的工具,为程序员提供了许多可以直接使用容器算法迭代器。《C++ 标准模板编程实战》这本书集中讲解了 STL 的使用方法和实战技巧,旨在帮助读者开发出高效且易于维护的 C++ 程序。 这本书共分为四个部分。第一部分介绍了 STL 的基础知识,主要包括容器迭代器算法、函数对象等内容。第二部分重点讲解了序列容器和关联容器,以及它们常见的应用。第三部分主要是算法,详细介绍了 STL 中常用的算法,并且通过实例演示了其使用方法。第四部分主要是 STL 的高级应用,如智能指针、异常处理、多线程等。 此外,这本书还提供了大量的实战案例,这些案例既包括独立的小应用程序,也包括较为完整的项目代码。通过这些案例,读者可以深入了解 STL 的使用和设计思路,并掌握一些实用的编程技巧。 总的来说,这本《C++ 标准模板编程实战》是一本非常实用的书籍,不仅适合初学者入门,也适合有一定经验的开发者进一步提高自己的编程技能。建议读者在学习这本书时,可以边读边动手实践,更好地理解和掌握其中的内容。 ### 回答2: c++标准模板编程实战是一本非常经典、详实的c++ STL实战教材,主要讲解了STL的各种容器算法迭代器的常用操作和实现原理,并且通过大量的实例演示了STL在真实项目中的实际应用。 本书总共分为10个章节,前两章是介绍STL的基础知识和核心组件,包括迭代器容器算法等;第三章是介绍序列容器,主要包括vector、list、deque、stack、queue、heap、priority_queue和bitset等;第四章是介绍关联容器,主要包括set、multiset、map、multimap等;第五章是介绍迭代器,包括迭代器分类,迭代器实现方式和应用场景等;第六章是介绍函数对象,包括函数对象的定义、STL内置函数对象、自定义函数对象和函数对象适配器等;第七章是介绍算法基础,包括常用算法和自定义算法的实现;第八章是介绍字符串,在字符串操作方面,STL提供了string和wstring类,以及一些与之相关的算法;第九章是介绍STL的高级用法,包括元编程、策略模式、继承体系、嵌套类和allocator等;第十章是介绍STL和相关技术的未来发展趋势和发展方向。 总的来说,c++标准模板编程实战是一本非常好的STL实战教材,既可以作为初学者入门的指南,也可以作为中高级程序员巩固和深入学习STL的参考书。无论是学习STL的基础知识、习惯性使用STL容器算法,还是在项目中灵活高效地应用STL,都会受益匪浅。 ### 回答3: c标准模板(STL)是一组C++的模板类和函数的集合,可以让程序员使用一些高效的算法和数据结构,从而降低了开发者的工作量,提高了C++程序的效率和可维护性。 《C++标准模板编程实战》是一本介绍STL的经典教材,全书共分为25个章节,内容涉及到STL的迭代器算法容器、函数对象、适配器等方面。可谓是STL入门的重要读物。 该书的编写思路以工程实践为导向,讲解一些常用的数据结构和算法的实现过程,并给出了一些标准中经典的函数的代码实现。例如,生成随机数的代码、字符串排序的代码、实现二叉堆的代码等等。这些代码可以帮助开发者更好地理解STL中的模板类和函数的实现原理和效率。 此外,该书对STL的算法进行了详细介绍,包括容器迭代器、函数对象等方面的应用。为了方便程序员,书中还提供了一些实用的STL程序的代码,例如STL的多个容器和关联式容器,还有STL中提供的适配器等。 总之,《C++标准模板编程实战》是学习STL的必备参考书,不仅深入浅出地讲解了STL的实现原理和应用,更是教会了我们如何将STL运用到工程中,将编程变得更加高效和简单。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值