c p stl

首先说明, stl 是一个很庞大的系统库, 包含 容器, 算法, 迭代器 , 仿函数, 适配器

其实在上面的几个部分, 我们最关心的应该是 容器, 和迭代器了吧
参考: https://www.nhooo.com/cpp/cpp-stl-tutorial.html

容器

组成部分
分为向量(vector),双向队列(deque),表(list),隊列(queue),堆栈(stack),集合(set),多重集合(multiset),映射(map),多重映射(multimap)

容器共同的函数
  • 大小相关:
    size(), 大小
    empty(), 是否空
    max_size() 最大容量

  • 迭代器相关
    begin(),end(), 从头开始
    rbegin(),rend() 从尾开始

  • 比较操作
    ==,!=,<,>,>=

容器 算法 迭代器

vector

向量(Vector)和数组(array)之间的区别
array 不能动态修改大小,vector 可以在运行时动态扩展大小

创建格式

#include <vector>
vector<object_type> v1;

实例

#include<iostream>
#include<vector>
using namespace std;
int main()
{
    vector<string> v1;
    v1.push_back("nhooo");
    v1.push_back(".com");
    for(vector<string>::iterator itr=v1.begin();itr!=v1.end();++itr){
        cout<<*itr;
    }
    return 0; 
}

访问的话,可以使用迭代器,索引或者 at 函数

  • 操作函数
    at(index) 返回索引处的元素, 越界报错
vector<object_type>  v;
v.at(k) ;

back() 返回最后一个元素的引用

vector<string>  fruit{"mango","apple","banana"};
    cout<<fruit.back();
> "banana"
  • front() 返回第一个元素
vector<string>  language{"java","C","C++"};
cout<<language.front();
  • 交换两个向量
v1.swap(v2);
  • 最后添加元素
v.push_back(k)
  • 删除最后的元素
v.pop_back();
  • 判断vector 是不是空的
bool v.empty()
  • 指定位置插入元素
insert(iterator,val);
insert(iterator,n,val);
insert(iterator,InputIterator first,InputIterator last);

iterator:迭代器定义位置,将在其中插入新元素。

val:val是指定要插入的值。

n:该值出现的次数。

(first,last):它定义了要插入的元素范围。

实例:

vector<int> v{1,2,3,4,5};
    vector<int> v1{6,7,8,9,10};
    v.insert(v.end(),v1.begin(),v1.begin()+5);
for(int i=0;i<v.size();i++)
    cout<<v[i]<<" ";

> 1 2 3 4 5 6 7 8 9 10
  • 删除指定元素
v.erase(pos);
v.erase(start_iterator,end_iterator);

pos:它定义要从向量(vector)中删除的元素的位置。

(start_iterator,end_iterator):它定义要从向量(vector)中删除的元素的范围。

 vector<string> fruit{ "芒果", "苹果", "草莓", "猕猴桃", "香蕉" };
fruit.erase(fruit.begin() + 1, fruit.begin() + 3);
> fruit : 芒果 猕猴桃 香蕉
  • 修改向量大小,截取或元素填充
v.resize(n,val);

n:这是新的向量(vector)大小。

val:如果n大于当前向量(vector)大小,则将value(val)插入添加的空间中。

如果 n 小于当前长度,则截取前  n 个元素

vector<string>  v1{"java","C","C++"};
v1.resize(5,".Net");
>v1:  java C C++ java C C++ .Net .Net
  • 清空元素
v.clear();
  • 获取元素数量
int n=v.size();
  • 向量容量 >= size() 返回的数
int c=v.capacity();
  • 批量赋值元素
v.assign(first,last);
v.assign(n,val);
(first,last):它定义了范围。将区间(first,last)的元素赋值到当前的vector容器中。

n:出现值的次数。

val:它定义要分配的值。

vector<int> v{1,2,3,4,5};
    vector<int> v1;
    v1.assign(v.begin()+1,v.end()-1);
v1:  2 3 4

vector<char> v;
v.assign(5,'C');
>v:  CCCCC
  • 迭代器位置
iterator it=v.end()
iterator it=v.begin()

更多函数


image.png
image.png

list

List是连续的容器,而vector是非连续的容器
列表中遍历速度很慢,因为列表元素是按顺序访问的,而vector支持随机访问

 list<int> l;
list<int>  new_list{1,2,3,4};
or
list<int> new_list = {1,2,3,4};
  • insert
iterator insert( iterator pos, const value_type value);
void insert( iterator pos, int n, const value_type value);
void insert( iterator pos, InputIterator first, InputIterator last);

更多方法:


image.png
  • 队列
    queue
    和其他类型不同的是, queue 是先进先出的结构。
template<class T, class Container = deque<T> > class queue;
方法:

empty   
size 
front   取出第一个元素
back  取出最后一个元素
push 末尾新增元素
pop  删除第一个元素


queue <int> fquiz;
    fquiz.push(10);
    fquiz.push(20);
    fquiz.push(30);

    cout << "队列fquiz是 : ";
    showsg(fquiz);

    cout << "\nfquiz.size() : " << fquiz.size();
    cout << "\nfquiz.front() : " << fquiz.front();
    cout << "\nfquiz.back() : " << fquiz.back();

map

typedef pair<const Key, T> value_type;

  • 添加数据
mapPerson.insert(pair < int,string > (1,"Jim"));
mapStudent.insert(map<int, string>::value_type (1, "student_one"));  

mapPerson[1] = "xxxx"

不同的是 [] 这种添加数据, 会覆盖相同的key, 二 insert 如果有相同的 key 存在,则不会新增成功

pair<map<int, string>::iterator, bool> Insert_Pair;
Insert_Pair = mapStudent.insert(map<int, string>::value_type (1, "student_one"));
if(Insert_Pair.second == true)  
        cout<<"Insert Successfully"<<endl;  
  • map 大小
Int nSize = mapStudent.size();

  • map 遍历
for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)  
 
       cout<<iter->first<<' '<<iter->second<<endl;  

first 是 key   second 是 value
for(int nindex = 1; nindex <= nSize; nindex++)  
        cout<<mapStudent[nindex]<<endl;  
>>  注意 index 是从 1 开始
  • map 取值
map<int, string>::iterator iter;  
    iter = mapStudent.find(1);  
    if(iter != mapStudent.end())  ;
       cout<<"Find, the value is "<<iter->second<<endl;  
  • map 删除元素
    erase() 参数可以是 一个 iterator, 也可以是两个 iterator (这个范围全部删除) 或者是一个具体的key
map<int, string>::iterator iter;  
  
       iter = mapStudent.find(1);  
  
       mapStudent.erase(iter);    

int n = mapStudent.erase(1);//如果删除了会返回1,否则返回0  
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 前言 Standard Template Library (STL)提供了四个部分,算法,容器,函数和迭代器。这里...
    wwwzy阅读 498评论 0 1
  • 目录 STL的六大部件介绍 容器分类 序列式容器介绍(vector、list、deque) 关联式容器 资料 收获...
    yabin小站阅读 812评论 0 3
  • (2020.12.08 Tues)STL容器允许重复利用已有的实现构造自己特定类型下的数据结构,通过设置一些模板类...
    Mc杰夫阅读 284评论 0 0
  • 原文地址: https://www.cnblogs.com/CnZyy/p/3317999.html 一、STL简...
    Caiaolun阅读 1,065评论 0 5
  • 更新日期:2019-09-11 概述 在使用容器之前,您应该至少了解 C++ 的基础知识,以及数据结构的基础知识(...
    行也成文阅读 284评论 0 0