STL容器及其底层

vector

vector为可变长数组,可以随时添加数据和删除元素。

一维初始化

cpp 复制代码
vector<int> a;

指定长度和初始值的初始化

cpp 复制代码
vector<int> v(n);//定义长度为n的数组,初始值默认为0,下表范围[0,n-1]
vector<int> v(n,1);//所有元素初始值为1

初始化当中有多个元素

cpp 复制代码
vector<int> a{1,2,3,4,5,6};

拷贝初始化

cpp 复制代码
vector<int> a(n,1);
vector<int> b=a;
vector<int> c(a);

二维初始化

cpp 复制代码
vector<int> v[5];
v[1].push_back(1);

一共五行,不可变,列可变

可变行列

cpp 复制代码
vector<vector<int>> v;
vector<int> t1{1,2,3,4};
vector<int> t2{4,5,7,8};
v.push_back(t1);
v.push_back(t2);

可变行列

cpp 复制代码
vector<vector<int>) a(n+1,vector<int>(m+1,0));//固定m+1行,n+1列为0

注意:end()返回的是最后一个元素后一个位置的地址,所有的STL容器均是如此

使用v.resize(n,v);的时候,如果v之前指定大小为pre

如果pre>n,数组会保留前n位元素,前n个元素仍然保留原来的值

如果pre<n,前n位仍然保持原来的元素

元素访问

下标法:和普通数组一样

迭代器法

cpp 复制代码
vector<int> v;
vector<int>::iterator it=v.begin();
for(int i=0;i<5;i++)
{
  cout<<*(it+i)<<endl;//迭代器访问方式一
}
vector<int<::iterator it;
for(it=v.begin();it!=v.end();++it)
{
   cout<<*it<<endl;
}




for(int i=0;i<5;i++)
{
  cout<<v[i]<<endl;//元素下标访问
}

智能指针

auto能够自动识别类型

cpp 复制代码
//输入
vector<int> a(n);
for(auto &x:a)
{
   cin>>x;
}
//输出
vector<int> v;
v.push_back(12);
v.push_back(23);
for(auto val:v)
{
    cout<<val<<" ";//输出12 23
}

v[i]与*(v.begin()+i)等价,与指针同理

map

每个键对应一个值

初始化

cpp 复制代码
mp<sreing,string> mp;
mp<string,int> mp;

map会按照键的大小,从小到大自动排序

迭代器正向遍历

cpp 复制代码
map<int,int> mp;
mp[1]=2;
mp[2]=3;
mp[3]=4;
auto it=mp.begin();
while(it!=mp.end())
{
   cout<<it->first<<" "<<it->second<<"\n";
   ++it;
}

添加元素:

方式一:

cpp 复制代码
mp["学习"]="看书";

方式二:

插入元素

cpp 复制代码
mp.insert(make_pair("head","头"));

方式三:

cpp 复制代码
mp.insert(pair<string,string>("fruit","水果"));

方式四:

cpp 复制代码
mp.insert({"haha","wawa"});

遍历访问:

方式一:迭代器遍历

cpp 复制代码
map<string,string>::iterator it;
for(it=map.begin();it!=map.end();++it)
{
  cout<<it->first<<" "<<it->second<<"\n";
}

方式二:智能指针访问

cpp 复制代码
for(auto it:mp)
{
   cout<<it.first<<" "<<it.end<<endl;
}

方式三:

对单个元素访问

cpp 复制代码
map<string,string>::iterator it=mp.find("a");
cout<<it->first<<" "<<it->second;

与unordered_map的比较

map:内部用红黑树实现,具有自动排序的功能

unordered_map:内部用哈希表实现,内部元素杂乱无序

set

set当中的元素不会重复,并且元素从小到大排列

初始化定义

cpp 复制代码
set<int> s;

元素访问

迭代器访问

cpp 复制代码
for(set<int>::iterator=it=s.begin();it!=s.end();it++)
{
   cout<<*it<<endl;
}

智能指针

cpp 复制代码
for(auto i:s)
{
   cout<<i<<endl;
}

访问最后一个元素

第一种

cpp 复制代码
cout<<*s.rbegin()<<endl;

第二种

cpp 复制代码
set<int> iterator::it=s.end();
it--;
cout<<(*it)<<endl;

第三种

cpp 复制代码
cout<<*(--s.end())<<endl;

重载<运算符

改变set排序,set当中默认用less比较器

cpp 复制代码
set<int> s1;//默认从小到大排序
set<int,greater<int>> s2;//从大到小排序

multiset

元素可以重复,并且元素有序

进行删除操作时,需要明确删除的目标

使用s.erase(val);时,会删除与val相同的所以元素。如果需要删除单个元素,需要使用s.erase(s.find(val));先找到一个与val相等的元素迭代器,专门删除这个元素

pair

pair只有两个元素,可以看作只有两个元素的结构体

第一个应用就是替代二元结构体,第二个就是作为map键值对插入

cpp 复制代码
pair<string,int> p("lisi",1);//带初始值
pair<string,int> p;//不带初始值

//赋值
p={"li",1};
p=make_pair("wang",2);
p=pair<string,int>("wang",2);

访问

cpp 复制代码
pair<int,int> p[20];
for(int i=0;i<=20;i++)
{
   cout<<p[i].first<<" "<<p[i].second;
}

string

cpp 复制代码
string str1;//生成空字符串
string str2("12345");
string str3("12345",0,3);//结果为123,从0位置开始,长度为3
string str4("12345",4);//结果为1234
string str5(5,'2');//结果为22222
string str6(str2,2);//结果为345

访问单个字符

cpp 复制代码
string s="hello";
for(int i=0;i<s.size();i++)
{
   cout<<s[i]<<endl;
}

string特性

支持比较运算符。按字典顺序比较,字典顺序靠前的字符小,靠后的大。遇到不相等的位置比较。

支持+运算符进行拼接。

getline(cin,s);会获取前一个换行的字符,需要在前面添加获取换行的语句。getline(cin,s);会获取前一个输入的换行符,需要在前面添加获取换行符的语句,getchar()或cin,get()

stack

STL当中先进后出,后进先出的容器。

cpp 复制代码
stack<int> s;

栈遍历

栈只能对栈顶进行操作,所以如果要想进行遍历,就必须将栈中的元素一个个取出来放进数组里

cpp 复制代码
stack<int> st;
for(int i=0;i<10;++i)
{
  st.push(i);//元素入栈
}
while(!st.empty())
{
  int st=s.top();//取出栈顶元素
  s.pop();//移除栈顶元素
}

数组模拟栈进行遍历

通过一个数组对栈进行模拟,一个存放下标的变量top模拟栈顶的指针

cpp 复制代码
int s[100];
int tt=-1;//tt代表栈顶指针,初始栈内无元素,tt为负一
for(int i=0;i<=5;++i)
{
   s[++tt]=i;
} 
//出栈
int top_element=s[tt--];

queue

队列是一种先进先出的数据结构

cpp 复制代码
queue<int> q;

deque

首尾都可以插入删除的队列称为双端队列

priority_queue

优先队列是在正常队列的基础上加了优先级,保证了每次队首的元素优先级都是最大的

底层是通过堆实现的

list

list的底层是带头双向循环列表

cpp 复制代码
list<int> l1;
list<int> l2(10,2);//构造10个2的int类型资源
list<int> l3(l2);
string s("hello");
list<char> l4(s.begin(),s.end());
相关推荐
念越2 小时前
算法每日一题 Day04|快慢双指针法解决环形链表问题
数据结构·算法·链表
chao1898442 小时前
具有飞行约束的无人机MPC MATLAB实现
开发语言·matlab·无人机
张人玉2 小时前
VisionPro 药物检测工具 学习笔记
算法·c#·机器视觉·vsionpro
_深海凉_2 小时前
LeetCode热题100-前 K 个高频元素
算法·leetcode·职场和发展
Byte不洛2 小时前
深入理解C++多态机制:虚函数、虚表与对象内存模型解析
c++·多态·对象模型·虚函数表·虚基表
leaves falling2 小时前
C++ 继承详解:从入门到深入
开发语言·c++
minji...2 小时前
Linux 网络基础(一)认识协议,网络协议,网络协议分层框架搭建,网络传输基本流程,跨网络的数据传输
linux·运维·服务器·网络·c++·网络协议
草木红2 小时前
Python 中使用 Docker Compose
开发语言·python·docker·flask
吃着火锅x唱着歌2 小时前
深度探索C++对象模型 学习笔记 第四章 Function语意学(1)
c++·笔记·学习