C++手稿:STL入门

STL (Standard Template Library) 提供了一些常用的数据结构和算法的模板,1998年加入C++标准。 STL中有三个基本概念:

  1. 容器:容纳各种数据类型的数据结构,是一系列的类模板。
  2. 迭代器:迭代器用来迭代地访问容器中的元素。
  3. 算法:用来操作容器中的元素,是一系列的函数模板。

STL 容器

STL中的容器定义在std命名空间下,需要引入头文件 <vector><set><map><deque><list><stack> 等。容器可以分为三大类:

  1. 顺序容器

    • vector:尾端插入元素有较高性能,动态数组实现;
    • deque:收尾插入元素都有较高性能,动态数组实现;
    • list:可以常数时间在任何地方插入元素,链表实现;
  2. 关联容器
    • set:不同元素的集合,平衡二叉树实现,检索时间是 O(log(N));
    • multiset:同上,但可以包含相同元数据;
    • map:同set,但存放的是键值对;
    • multimap:同上,键可以重复;
  3. 容器适配器:stackqueuepriority_queue

这些容器有一些通用的方法:emptysizeswapmax_size。前两类容器支持迭代器,称为第一类容器。

对于顺序容器,有更多的通用方法:frontbackpop_backpush_back

容器之间的比较取决于第一个不等的元素;如果长度相同且所有元素相等,两个容器相等;如果一个是另一个的子序列,则较短的容器小于较长的容器。

对于存储着键值对关联容器mapmultimap,它们的迭代器是一个pair<T1,
T2>
的指针。 插入时,可以直接使用[]运算符,也可以插入insert一个pair<T1,
T2>
对象:

std::map<char,int> mymap;
mymap.insert (mymap.begin(), std::pair<char,int>(‘c‘,400));
mymap.insert (mymap.begin(), std::make_pair(‘c‘,400));

pair模板类在<utility>中定义,在<map>中已经引入了。

容器适配器是逻辑数据结构,需要用一种顺序容器来实现。例如,stack默认使用deque来实现,我们也可以指定它的实现方式。

stack<string> strstk;         // string 型栈,deque实现
stack<int, vector<int>> stk;  // int 型栈,vector实现

STL 迭代器

只有第一类容器支持迭代器(容器适配器不支持迭代器)。来个例子:

vector<int> v;
for(vector<int>::reverse_iterator r = v.rbegin(); r < v.rend(); r++){
    cout<<*r;
}

取决于不同的存储方式,不同容器支持的迭代器是不同的。这些迭代器按功能的强弱分为5类:

  1. Input Iterator:提供只读访问
  2. Output Iterator:提供只写访问
  3. Forward Iterator:支持逐个向后迭代访问
  4. Bidirectional Iterator:能够双向地逐个迭代访问
  5. Random Access Iterator:可随机访问每个元素

例如,双向迭代器不支持<>[]运算符,只能判等:

list<int> l;
for(list<int>::const_iterator i = l.begin(); i != l.end(); ++i){
    cout<<*i;
}

vectordeque支持Random
Access Iterator,listset/multisetmap/multimap支持Bidirectional
Iterator。

STL 算法

STL通过函数模板提供了很多作用于容器的通用算法,例如查找、插入、删除、排序等,需要引入头文件<algorithm>

变化序列的:copyremovereversefillreplaceswap,
...;不变化序列的:findcountfor_eachequal,
...

这些算法的实现较为通用,也可以作用于C语言的数组。

例如,find用值来搜索一个元素的迭代器:

vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
vector<int>::iterator p = find(v.begin(), v.end(), 3);
if(p != v.end()) cout<<*p;
// 3

例如,copy用来做容器之间的拷贝:

ostream_iterator<int> output(cout, " ");
copy(v.begin(), v.end(), output);
// 1 2 3

例如,erase用来删除一个区间的元素:

v.erase( v.begin(), v.end());
// 等效于
v.clear();

例如,lower_bound(FwdIt
f, FwdIt l, const T& val)
用来给出小于val的坐标上限(前闭后开)。 upper_bound(FwdIt
f, FwdIt l, const T& val)
用来给出大于val的坐标下限(前闭后开):

std::map<char,int> mymap;
std::map<char,int>::iterator itlow,itup;

mymap[‘a‘]=20;
mymap[‘b‘]=40;
mymap[‘c‘]=60;
mymap[‘d‘]=80;
mymap[‘e‘]=100;

itlow=mymap.lower_bound (‘b‘);  // itlow points to b
itup=mymap.upper_bound (‘d‘);   // itup points to e (not d!)

参见: http://www.cplusplus.com/reference/map/map/upper_bound/

实现一个Iterator

为了实现上述ostream_iterator,需要了解copy的实现方式:

template<class _II, class _OI>
inline _OI copy(_II _F, _II _L, _OI _X){
    for(;_F != _L; ++_X, ++_F)
        *_X = *_F;
    return (_X);
}

因此ostream_iterator需要重载++*=

template<class T>
class ostream_iterator{
    string sep;
    ostream& o;
public:
    ostream_iterator(ostream& _o, string _s):o(_o), sep(_s){}
    ostream_iterator& operator=(const T& v){
        o<<v<<sep; return *this;
    }
    ostream_iterator& operator*(){ return *this; }
    ostream_iterator& operator++(){ return *this; };
}


除非注明,本博客文章均为原创,转载请以链接形式标明本文地址: http://harttle.com/2015/07/01/introduction-to-stl.html

版权声明:本文为博主原创文章,转载请附上原文链接。

时间: 2024-10-10 13:21:09

C++手稿:STL入门的相关文章

STL入门

STL的组成 六大组件 容器container 算法algorithm 迭代器iterator 仿函数function object 适配器adaptors 空间配制器allocator 产生一个vector容器,并打印 1 #include <iostream> 2 #include <vector>//容器 3 #include <algorithm>//算法 4 5 template<class T>//实现一个类模板,专门实现打印的功能 6 clas

【c++】标准模板库STL入门简介与常见用法

一.STL简介 1.什么是STL STL(Standard Template Library)标准模板库,主要由容器.迭代器.算法.函数对象.内存分配器和适配器六大部分组成.STL已是标准C++的一部分,使用STL开发系统可以提高开发效率. 2.容器(Containers) 容器类是可以包含其它对象的模板类,如向量类(vector).链表类(list).双向队列类(deque).集合类(set)和映射类(map)等.其中vector.list.deque为序列式容器,set.map为关联式容器.

[技术] OIer的STL入门教程

注: 本文主要摘取STL在OI中的常用技巧应用, 所以可能会重点说明容器部分和算法部分, 且不会讨论所有支持的函数/操作并主要讨论 C++11 前支持的特性. 如果需要详细完整的介绍请自行查阅标准文档. 原始资料源于各大C++参考信息网站/C++标准文档和Wikipedia. 1.概述 首先, 什么是STL? STL, 即标准模板库, 全称Standard Template Library , 主要包含4个组件, 即算法, 函数, 容器, 迭代器. 这里的函数似乎主要指函数式编程(FP)中的函数

[c++]STL入门

1.动态创建指针,忘记释放将导致内存泄漏 即使用int* p = new int[size]; 必须使用delete释放内存, 如果没有释放,那么将无法访问自由存储空间的结构,因为所有指向该内存的指针都无效,这一部分内存相当于死内存,导致程序可用内存越来越少,从而程序崩溃. 2.extern关键字解析 http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html   //博客 http://baike.baidu.com/

stl入门--reverse函数

#include<iostream> #include<algorithm>          using namespace std; int main() {     char a[]="0123456789";     int len=strlen(a);     reverse(&a[0],&a[6]);        //a[6]没参加reverse     for(int i=0;i<10;i++)         cout&l

STL入门学习中碰到的一些函数

2020.02.10 fill #include<algorithm> vector<int> v{ 1, 2, 3, 3 }; fill(v.begin(), v.end(), 4);//正向迭代器 cout << v.size() << endl; for (auto x : v) cout << x << " "; fill_n #include<algorithm> vector<int&

【C/C++学院】0828-STL入门与简介/STL容器概念/容器迭代器仿函数算法STL概念例子/栈队列双端队列优先队列/数据结构堆的概念/红黑树容器

STL入门与简介 #include<iostream> #include <vector>//容器 #include<array>//数组 #include <algorithm>//算法 using namespace std; //实现一个类模板,专门实现打印的功能 template<class T> //类模板实现了方法 class myvectorprint { public: void operator ()(const T &

《算法竞赛入门经典(第二版)》pdf

下载地址:网盘下载 内容简介  · · · · · · <算法竞赛入门经典(第2版)>是一本算法竞赛的入门与提高教材,把C/C++语言.算法和解题有机地结合在一起,淡化理论,注重学习方法和实践技巧.全书内容分为12 章,包括程序设计入门.循环结构程序设计.数组和字符串.函数和递归.C++与STL入门.数据结构基础.暴力求解法.高效算法设计.动态规划初步.数学概念与方法.图论模型与算法.高级专题等内容,覆盖了算法竞赛入门和提高所需的主要知识点,并含有大量例题和习题.书中的代码规范.简洁.易懂,不

UVA 10474

题意:给你一组数,再给几个数问是否在一组数中. 题很简单:STL入门. 没用到STL. #include<iostream> #include<cstdio> #include<algorithm> using namespace std; int a[10005]; int main() { int ncase = 1; //freopen("in.txt","r",stdin); int n,m; while(scanf(&q