容器主要分为:顺序容器和关联容器

顺序容器和关联容器,顺序容器主要有:vector、list、deque等。其中vector表示一段连续的内存地址,基于数组的实现,list表示非连续的内存,基于链表实现。deque双向队列与vector类似,但是对于首元素提供删除和插入的双向支持。关联容器主要有map和set。map是key-value形式的,set是单值。map和set只能存放唯一的key值,multimap和multiset可以存放多个相同的key值, 还有unorder_multimap等。

顺序容器

vector

/*
* 什么是vector, vector的特点
* vector类似一个动态数组,是一段地址连续的空间
* vector和array的区别:vector支持动态空间调整,随着元素的增加,大小会改变
*/
   // 初始化:

    vector<int> v;
vector<int> v2(); // 可以容纳10个int
vector<int> v3(, ); // 10个2
vector<int> v4(v2);
int arr[] = {,,,};
vector<int> v5(arr, arr+); // 其他操作, 是vector容器自带的函数,不包含全局的算法(find查找,remove_if删除等)
// 添加元素
vec.push_back(); // 在最后添加元素
insert();
/*
iterator insert( iterator loc, const TYPE &val );
void insert( iterator loc, size_type num, const TYPE &val );
void insert( iterator loc, input_iterator start, input_iterator end );
insert() 函数有以下三种用法: 在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器,
在指定位置loc前插入num个值为val的元素
在指定位置loc前插入区间[start, end)的所有元素 . */
// 删: // erase
iterator erase( iterator loc );
iterator erase( iterator start, iterator end );
// erase函数要么删作指定位置loc的元素,要么删除区间[start, end)的所有元素.
// 返回值是指向删除的最后一个元素的下一位置的迭代器.例如: vec.clear(); // 清空容器
vec.pop_back(); // 移除尾部元素,无返回值 // 查
vec.back(); // 返回最有一个元素的引用
vec.begin(); // 返回当前容器首元素的迭代器
vec.end(); // 尾后迭代器
vec.rbegin(); // rbegin函数返回指向当前vector末尾的逆迭代器
vec.rend(); // rend()函数返回指向当前vector起始位置的逆迭代器. 类似与begin和end 其他
vec.empty(); // 判断是否为空
vec.capacity(); // 返回当前vector在重新进行内存分配以前所能容纳的元素数量.
// reserve()函数为当前vector预留至少共容纳size个元素的空间 // void resize( size_type size, TYPE val );
vec.resize(); // resize() 函数改变当前vector的大小为size,且对新创建的元素赋值val
vec.size(); // 返回当前所容纳的元素个数
// vec.swap(vec2) // vec和vec2交换
// 遍历:
void print(vector<int>& vec)
{
for (int i = ; i < vec.size(); i++)
cout << vec[i] << " "; for (vector<int>::iterator it = vec.begin(); it != vec.end(); it++)
{
cout << *it << " ";
}
for (auto item : vec)
{
cout << item << " ";
}
cout << endl;
}

vector常用方法

deque

支持随机访问和快速插入和删除

// 双向队列和向量很相似,但是它允许在容器头部快速插入和删除(就像在尾部一样)。
// 就是比vector多了两个方法:
push_front()
pop_back()
// 具体使用方法参考vector

#include <iostream>
#include <algorithm>
#include <deque>
using namespace std; void printDeq(deque<int> &d1)
{
cout << "deque迭代器遍历:";
for (deque<int>::iterator it = d1.begin(); it != d1.end(); it++)
{
cout << *it << " ";
}
cout << endl << endl;
}
void test41()
{
deque<int> d1;
d1.push_back();
d1.push_back();
d1.push_back();
d1.push_front(-);
d1.push_front(-);
d1.push_front(-); printDeq(d1);
cout <<"头部元素:" << d1.front() << endl;
cout <<"尾部元素:" << d1.back() <<endl; d1.pop_front(); // 弹出头部元素
d1.pop_back(); // 弹出尾部元素 cout << "弹出头部,和尾部之后: ";
printDeq(d1); // 查找-33在数组下标的值
deque<int>::iterator it = find(d1.begin(),d1.end(), -); if (it != d1.end())
{
// 计算下标
cout <<"-33的数组下标是" << distance(d1.begin(), it) << endl;
}
else
{
cout <<"未找到"<<endl;
} }
int main40()
{
test41();
return ;
}

deque例子

list

list,list是stl实现的双向链表,

与向量vector想比,它允许快速的插入和删除,但是随机访问却是比较慢

结构图:

优点:随意插入和删除,替换元素效率极高

缺点:查找慢(不能随机访问:就是只能从头开始遍历)

不建议想里面插入数据,效率太低

/ 其他操作
// 初始化,创建
list<int> lst1; //创建空list
list<int> lst2(); //创建含有三个元素的list
list<int> lst3(,); //创建含有三个元素为2的list
list<int> lst4(lst2); //使用lst2初始化lst4
list<int> lst5(lst2.begin(),lst2.end()); //同lst4 // 增
lst1.assign(lst2.begin(),lst2.end()); //分配值,3个值为0的元素
lst1.push_front(); // 1加到list的首部
lst1.push_back(); //末尾添加值 lst1.insert(); //返回值是一个迭代器,指向被插入的元素。
iterator insert( iterator pos, const TYPE &val ); // 插入元素val到位置pos
void insert( iterator pos, size_type num, const TYPE &val ); // 插入num个元素val到pos之前
void insert( iterator pos, input_iterator start, input_iterator end ); // 插入start到end之间的元素到pos的位置
// 删
lst1.pop_back(); // 删除链表的最后一个元素。
lst1.pop_front(); // 删除连链表第一个元素
lst1.remove(); // 删除链表中所有的1 void
lst1.remove_if( UnPred pr)// 以一元谓词pr为判断元素的依据,遍历整个链表。如果pr返回true则删除该元素。 lst1.erase()
iterator erase( iterator pos );
iterator erase( iterator start, iterator end );
erase()函数删除以pos指示位置的元素, 或者删除start和end之间的元素。 返回值是一个迭代器,指向最后一个被删除元素的下一个元素。 lst1.clear() // 清除所有元素
// 改
lst1.reverse(); // 将所有的list倒转
lst1.swap(list2); // 1和2交换
lst1.unique(); // 删除重复的元素
void unique();
void unique( BinPred pr );
unique()函数删除链表中所有重复的元素。如果指定pr,则使用pr来判定是否删除。 // 查
lst1.begin(); // 返回list的首元素的迭代器
lst1.end(); // 返回list尾后迭代器
lst1.front(); // 返回一个指向首元素的引用
lst.back() // 返回一个引用,指向list的最后一个元素。
lst1.rbegin(); // 返回一个逆向迭代器,指向链表的末尾。 rend和begin和end用法类似 // 其他
lst1.empty(); // 判断是否为空 true为空
lst1.max_size(); //max_size()函数返回链表能够储存的元素数目。
lst1.merge()
void merge( list &lst );
void merge( list &lst, Comp compfunction );
merge()函数把自己和lst链表连接在一起,产生一个整齐排列的组合链表。如果指定compfunction,则将指定函数作为比较的依据。 lst1.resize();
void resize( size_type num, TYPE val )// resize()函数把list的大小改变到num。被加入的多余的元素都被赋值为val
lst1.size(); // 返回链表的元素数量
lst1.sort(); // 排序
void sort();
void sort( Comp compfunction );
sort()函数为链表排序,默认是升序。如果指定compfunction的话,就采用指定函数来判定两个元素的大小。 // 遍历: // list不能随机访问 就是 it++正确,但是不能it+2 it = l.begin();
it++;
it++;
it++; // 此时it指向第4个元素,元素为3
l.insert(it, ); // 在3前面插入100 for (auto it = lst1.begin(); it != lst1.end(); it++)
cout << *it << " ";
for (auto it : lst1)
cout << it << " ";
// 加上&可以修改值
for (auto& it : lst1)
cout << it << " ";

list常用操作

stack


不允许遍历
C++ Stack(堆栈) 是一个容器类的改编,为程序员提供了堆栈的全部功能,——也就是说实现了一个先进后出(FILO)的数据结构。
    stack<int> s;
s.push(); // 在栈顶添加元素
s.push();
s.top(); // 返回栈顶元素
s.pop(); //删除栈顶元素
s.empty(); // 判断栈空
s.size(); // 判断栈中元素数量
//
// Created by lk on 18-6-3.
//
#include <iostream>
#include <stack>
#include <cstring>
#include <algorithm>
using namespace std; // 出栈
void printStack(stack<int> &sta)
{
while(!sta.empty())
{
cout << sta.top() << " "; // 获取栈顶元素
sta.pop(); // 出栈
}
}
void test51()
{
stack<int> s;
// 入栈
for(int i = ; i != ; i++)
{
s.push(i+);
} printStack(s);
} // 栈模型
// 栈的算法 和数据类型的分离
// teacher节点
class Teacher
{
private:
int age;
char name[];
public:
Teacher()
{
age = ;
strcpy(name, "");
}
Teacher(char *name, int age)
{
this->age = age;
strcpy(this->name, name);
}
void print()
{
cout << "name: " << name << "age: " << age << endl;
}
friend ostream& operator<<(ostream &out, Teacher &obj)
{
out << " name: " << obj.name << " age: " << obj.age << endl;
return out;
}
};
// 存放类 类型
void test52()
{
Teacher t1("t1", ), t2("t2", ), t3("t3", );
stack<Teacher> Stack_Tea;
Stack_Tea.push(t1);
Stack_Tea.push(t2);
Stack_Tea.push(t3); while(!Stack_Tea.empty())
{
// Teacher重载了<<所以可以 cout<<
cout <<Stack_Tea.top();
Stack_Tea.pop();
}
}
// 存放 类指针 类型
void test53()
{
Teacher t1("t1", ), t2("t2", ), t3("t3", );
stack<Teacher*> Stack_Tea;
Stack_Tea.push(&t1);
Stack_Tea.push(&t2);
Stack_Tea.push(&t3); // 出栈
while(!Stack_Tea.empty())
{
cout << (* Stack_Tea.top()); // Stack_Tea.top() 就是&t1
Stack_Tea.pop();
}
} int main()
{
// test51();
test52();
// test53();
return ;
}

测试

queue

队列,栈都不能提前分配空间,需要进栈出栈, 不能遍历, 
队和栈是两种封装好的数据结构
back()    返回最后一个元素
empty() 如果队列空则返回真
front() 返回第一个元素
pop() 删除第一个元素
push() 在末尾加入一个元素
size() 返回队列中元素的个数
//
// Created by lk on 18-6-3.
//
#include <iostream>
#include <queue>
#include <cstring>
using namespace std; // 队列的基本类型
void test61()
{
queue<int> q; // 队列,栈都不能提前分配空间,需要进栈出栈
// 入队
q.push();
q.push();
q.push(); cout << "队头元素:" << q.front() << endl; // 返回队头元素,不是删除,栈的是删除
cout <<"队的大小:" << q.size() <<endl;
cout << "队尾元素:" << q.back() << endl;
// 出队
cout <<"出队: ";
while(!q.empty())
{
cout << q.front() << " ";
q.pop(); // 删除队头元素
}
} // 队列的算法 和数据类型分离
// teacher 节点
class Teacher
{
private:
int age;
char name[];
public:
Teacher()
{
age = ;
strcpy(name, "");
}
Teacher(char *name, int age)
{
this->age = age;
strcpy(this->name, name);
}
void print()
{
cout << "name: " << name << " age: " << age << endl;
}
friend ostream& operator<<(ostream &out, Teacher &obj)
{
out << "\tname: " << obj.name << " age: " << obj.age << endl;
return out;
}
}; // 存放类 类型
void test62()
{
Teacher t1("t1", ), t2("t2", ), t3("t3", ); queue<Teacher> queue_Tea; // 队列里面存放的是 Teacher的数据类型
queue_Tea.push(t1); // 入队
queue_Tea.push(t2);
queue_Tea.push(t3); cout << "老师节点的出队:\n";
while(!queue_Tea.empty())
{
cout << queue_Tea.front() << "\n";
queue_Tea.pop(); // 出队
}
}
// 存放指针类型
// 类似栈 。。。
int main()
{
// test61();
test62();
return ;
}

测试

关联容器

https://www.cnblogs.com/xiaokang01/p/9130699.html


STL顺序容器的基本操作的更多相关文章

  1. STL顺序容器【vector】【deque】【list】

    我们都知道,stl在集装箱船分为两类,订购集装箱和相关的容器. 顺序容器有三种即动态数组vector,双端队列deque,以及链表list (对csdn的文字排版严重吐槽.写好的版发表了就变了) 一: ...

  2. C++ STL 顺序容器--list + 关联容器

    list 双向链表,可以双向遍历,既指向前驱节点,又指向后继但不能随机访问任意元素,可动态增加或者减少元素,内存管理自动完成,增加任何元素都不会使迭代器失效, 删除元素时,除了指向当前被删元素的迭代器 ...

  3. STL顺序容器用法自我总结

    顺序容器类型:vector.deque.list.forward_list.string.array. queue(单向队列)底层也是用deque(双端队列)实现的 a.swap(b); swap(a ...

  4. STL关联容器的基本操作

    关联容器 map,set map map是一种关联式容器包含 键/值 key/value 相当于python中的字典不允许有重复的keymap 无重复,有序 Map是STL的一个关联容器,它提供一对一 ...

  5. STL之容器基本操作

    容器类 STL Container Header Applications vector <vector> 直接访问任意元素,快速插入.删除尾部元素 deque <deque> ...

  6. STL之顺序容器

    顺序容器: vector:数组 list:链表 deque:双端数组 顺序容器适配器: stack:堆栈 queue:队列 priority_queue:优先级队列 deque是一个动态数组 dequ ...

  7. C++——STL中三种顺序容器的简要差别

    C++ STL 提供了3个顺序容器 :vector, deque, list Vector动态数组.支持高速訪问:list双向链表,支持高速插入和删除. vector 中的元素是顺序存放的.所以随机訪 ...

  8. C++ STL之vector容器的基本操作

    注意事项:特别注意任何时候同时使用两个迭代器产生的将会是一个前闭后开的区间(具体见插入和删除的例子)特别注意begin()指向的是vec中的第0个元素,而end是指向最后一个元素的后面一个位置(不是最 ...

  9. STL之如何选择顺序容器

    一.顺序容器的分类 顺序容器:vector向量.list链表.deque双端队列: 优先级最高的是vector向量,它的速度比较快,优点最多: 在程序设计中,容器可以切换: #include < ...

随机推荐

  1. 利用phpqrcode二维码生成类库合成带logo的二维码并且用合成的二维码生成海报(二)

    前期准备 引入phpqrcode类库(下载地址:https://download.csdn.net/download/weixin_37557729/11891240:支持彩色二维码的下载地址:htt ...

  2. Scrum会议(十周)

    1.任务分配 2.会议内容探讨了本次取得的重大突破和后续要继续开展的工作.分析了自己在前端开发遇到的问题,以及如何优化自己的前端界面.然后分工,每人都去优化一部分界面,比如段祥负责个人中心的优化,程吉 ...

  3. 转载-ThreadPoolExecutor里面4种拒绝策略(详细)

    原文链接:https://blog.csdn.net/wjs19930820/article/details/79849050 1 /** * 定义异步任务执行线程池 */ @Configuratio ...

  4. 【Linux命令】工作目录切换命令(pwd,cd,ls)

    目录 pwd显示当前的工作路径 cd切换工作目录 ls显示目录中文件信息 一.pwd命令 pwd命令用于显示当前的工作路径. 格式: pwd [选项] 参数: -L,--logical,显示当前的路径 ...

  5. Jenkins操作学习 --邮箱配置及测试结果构建

    前言 使用jenkins做持续集成工具,构建的整个过程中,肯定要对结果进行记录和跟踪,这里我们以qq邮箱为例,来讲解如何配置jenkins的邮箱及发送构建结果 一.明确邮箱服务器相关信息 这里我们,要 ...

  6. RPA 可以给医疗行业带来哪些好处

    如今,医疗保健行业通过利用颠覆性科学技术,使护理服务更加高效.医疗保健行业已经转向数字化,很多大型医疗机构开始采用 RPA(机器人流程自动化),使医疗服务的竞争力不断攀升.使用 RPA 可以完美自动化 ...

  7. mysql 优化之 is null ,is not null 索引使用测试

    关于mysql优化部分,有很多网友说尽量避免使用is null, is not null,select * 等,会导致索引失效,性能降低?那是否一定收到影响呢?真的就不会使用索引了吗? 本文的测试数据 ...

  8. JQuery学习笔记(2)——数组 属性 事件

    each遍历 JQueryObjectArray.each(function(index,Element)) $(".myTable").each(function(i,ele){ ...

  9. MySQL 表和列的注释

    像代码一样,可以为表以及表中的列添加注释,方便其他人知晓其功能.对于一些字段,在经过一定时间后,创建者未必也能想起其具体的含意,所以注释显得尤为重要. 注释的添加 注释的添加是通过在定义表或列的时候在 ...

  10. Spring Security 教程 大牛的教程

    https://www.iteye.com/blog/elim-2247073 Spring Security 教程 Spring Security(20)——整合Cas Spring Securit ...