下面进行STL的学习。希望能了解标准模板库中的常用容器,迭代器,可以自由运用STL以提高编写代码的效率。下面的内容我想以知识点为总结,不再像《Effective C++》那样以章节进行总结,这样写可能毫无组织,但可以看到整个学习的历程。点击查看Evernote原文

#@author:       gr
#@date: 2014-07-18
#@email: forgerui@gmail.com

一、Contents


  1. C++模板

    • 类模板
        template<typename T1, typename T2>
    class Test{
    //下面的函数使用了T1,T2模板
    int count(T1 x, T2 y){
    return x.num + y.num;
    }
    };
    + 函数模板
```cpp
//使用传进来的str构造一个容器类Container
template<typename Container>
T make(string str){
return Container(str.begin(), str.end());
}
//-----------------------------------------------
//make函数的使用vector, list, deque...
vector<char> vStr = make<vector<char>>("hello");
list<char> lStr = make<list<char>>("hello");
deque<char> dStr = make<deque<char>>("hello");
// ...
+ 成员函数模板(在类模板中,还可以使用成员函数模板,两者不受影响)
```cpp
template<typename T1, typename T2>
class Test{
//下面的函数使用了T1,T2模板
int count(T1 x, T2 y){
return x.num + y.num;
}
template<typename T>
void show(T x){
std::cout<<x.num<<endl;
}
};

2. 默认模板参数
```cpp
template<typename T, typename Allocator = allocator<T> >
class vector{
// ...
}

通过allocator<T>为第2个模板参数Allocator赋一个初值,allocator类型(用户自己定义的一个类)则在未提供第二个模板时使用。这样,vector<int>vector<int, allocator<int>都是可以的。

  1. 容器

    • 序列容器
    • vector<T>:提供对变长序列的随机访问
    • deque<T>:提供对变长序列的随机访问
    • list<T>:提供对变长序列的线性时间访问O(N),其中N是序列的当前长度。
    • 顺序关联容器
    • set<Key> 惟一的键
    • multi<Key> 可重复的键
    • map<Key, T> 惟一的键索引类型T
    • multimap<Key, T> 可重复的键索引类型T
        #include<map>
using namespace std;
int main()
{
map<string, long>directory;
directory["A"] = 1;
directory["B"] = 2;
directory["C"] = 3;
string name = "B";
//查找name
map<string, long>::iterator it = directory.find(name);
if (it != directory.end())
cout<<"find the str, value is "<<*it<<endl;
}
  1. 类属算法
   //1. reverse: 逆序
reverse(vector.begin(), vector.end());
//2. find: 在序列中查找特定值'e'
string::iterator it = find(str.begin(), str.end(), 'e');
//map中的find
map<Key, T>::iterator it = _map.find(key);
//3. merge: 将两个容器中的东西拷贝到一个容器中
/**
* @func: merge
* @params: first1, last1分别表示输入序列的起始和终止位置
* @params: first2, last2分别表示另一个输入序列的起始和终止位置
* @params: result表示合并后序列存放的位置
* @example: 合并string与list到deque
* merge(str, str+strlen(str), list1.begin(), list1.end(), deque1.begin());
* merge(str.begin(), str.end(), list1.begin(), list1.end(), deque1.begin());
*
* @comments: !!!注意,这里的两个输入都必须是升序排列的,否则报错
*/
merge(first1, last1, first2, last2, result);
//4. replace: 替换其中的值
replace(a.begin(), a.end(), 'a', 'b');
//5. copy: 拷贝一段东西到另一个容器中
copy(a.begin(), a.end(), b.begin());
  1. 迭代器
  • 输入迭代器
  • 输出迭代器
  • 前向迭代器
  • 双向迭代器
  • 随机访问迭代器
  • 插入迭代器
    • back_insert_iterator
    • front_insert_iterator
    • insert_iterator
  • 流迭代器
    • istream_iterator
    • ostream_iterator
  1. 函数对象

  2. 适配器

  3. 分配器

二、References


  1. 迭代器和类属算法介绍

###STL学习--标准模板库的更多相关文章

  1. C++学习笔记——STL(标准模板库)

    1.首先.需要学习C++ 模板的概念 2.C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量.链表. ...

  2. C++ STL(标准模板库)的学习了解

    C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量.链表.队列.栈. C++ 标准模板库的核心包括以 ...

  3. std(标准库)和STL(标准模板库)的关系

    C++标准库的内容分为10类: C1.语言支持 C2.输入/输出 C3.诊断 C4.一般工具 C5.字符串 C6.容器 C7.迭代器支持 C8.算法 C9.数值操作 C10.本地化: 下面分类详解: ...

  4. C++ STL(标准模板库)

    一.STL简介 STL(Standard Template Library,标准模板库)是惠普实验室开发的,在被引入C++之前该技术就已经存在了很长的一段时间. STL的代码从广义上讲分为三类:alg ...

  5. C++之STL(标准模板库)

    STL:standard Template Lib 一.vector <1> 特点 <2> 常用函数: <3> 遍历方法: 1.for循环 2.迭代器 <4& ...

  6. STL(标准模板库)

    STL 主要分为三类: container(容器) - 用来管理一组数据元素 lterator(迭代器) - 可遍历STL容器内全部或部分元素的对象 algorithm(算法) - 对数据进行处理(解 ...

  7. C++入门学习——标准模板库之vector

    vector(向量容器),是 C++ 中十分实用一个容器.vector 之所以被觉得是一个容器,是由于它可以像容器一样存放各种类型的对象,简单地说,vector 是一个可以存放随意类型(类型可以是in ...

  8. STL学习系列之一——标准模板库STL介绍

    库是一系列程序组件的集合,他们可以在不同的程序中重复使用.C++语言按照传统的习惯,提供了由各种各样的函数组成的库,用于完成诸如输入/输出.数学计算等功能. 1. STL介绍 标准模板库STL是当今每 ...

  9. C++ 标准模板库介绍(STL)

    1. STL 基本介绍 C++ STL(标准模板库)是惠普实验室开发的一系列软件的统称,是一套功能强大的 C++ 模板类.STL的目的是为了标准化组件,这样就不用重新开发,让后来者可以使用现成的组件, ...

随机推荐

  1. [OC Foundation框架 - 18] Class

    使用Class来创建实例 // 18.通过@"Ball"创建一个Ball实例(不可以使用[[Ball alloc] init]创建) NSString *className = @ ...

  2. OpenCV学习笔记:MAT解析

    在2001年刚刚出现的时候,OpenCV基于 C 语言接口而建.为了在内存(memory)中存放图像,当时采用名为 IplImage 的C语言结构体,时至今日这仍出现在大多数的旧版教程和教学材料.但这 ...

  3. 【Stage3D学习笔记续】真正的3D世界(五):粒子特效

    先看效果,按下空格键添加粒子特效: 一般而言粒子特效的实现都是比较复杂的,且不说实现粒子特效的编码和设计,光是编写一个粒子编辑器就不是简单的一件事,但是作者使用了很取巧的方式来完成,我们接下来深入代码 ...

  4. cocos2d 场景转换的方法执行顺序

    转自:http://shanbei.info/the-cocos2d-scene-conversion-method-execution-order.html 如果你希望在场景转换的过程中使用过渡效果 ...

  5. linux就是这个范儿之融于心而表于行(1)

    原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 .作者信息和本声明.否则将追究法律责 时间总是过得那么快,如流水一般哗啦啦的就淌走了一大堆!周遭事事沧桑变迁喧哗或耳语中流传的故事已渐模糊 ...

  6. IOS - UIImage

    IOS中对图片的处理 UIImage UIImage 继承于NSObject 以下介绍一下UIImage中的方法 首先是我们最经常使用的 通过图片的文件名称来获取这个图片 + (UIImage *)i ...

  7. unity3D Socket连接C#server出现unity3D编辑器再次启动连接 unity3D编辑器马上卡死

    unity3D Socket与C#server第一次连接时通讯正常.客服端段关闭后.unity3D编辑器再次启动连接 unity3D编辑器马上卡死 原因是Socket处于异步状态,而异步线程是不受Un ...

  8. HDU1009 FatMouse' Trade

    FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  9. eclipse安装android sdk后工具栏没有图标的设置

    如果没有出现这android图标,选择'Window>Customize Perspective...>Commands',并在'Available command groups'中勾选' ...

  10. focus on these tools

    http://www.oschina.net/p/dubbo http://www.blogjava.net/hispark/archive/2008/12/01/243310.html http:/ ...