STL容器总共三大类:序列容器,关联容器,容器适配器。书上讲的太笼统,我只能自己整合一下下了……首先是序列容器——提供顺序表的表示和操作。
容器共同操作
表达式、函数调用 | 功能 |
---|---|
c1 op c2 | 关系运算,==、!=、>、<等 |
c.size() | 返回容器元素个数 |
c.max_size() | 返回容器可容纳最大元素数目 |
c.empty() | 判断容器是否为空 |
c.clear() | 清空容器 |
c.begin() | 指向尾元素的迭代器 |
c.end() | 指向尾元素下一个位置的迭代器 |
c.rebegin() | 指向尾元素的迭代器 |
c.rend() | 指向首元素前一个的迭代器(逆序的最后一个元素后边的位置) |
c.insert(position,n) | 在position插入n |
c.erase(position) | 删除position位置的元素 |
c.erase(begin,end) | 删除从begin到end位置的元素 |
备注 :比较 begin/end 和 rbegin/rend 迭代器
序列容器的操作
表达式、函数调用 | 功能 |
---|---|
c.front() | 访问容器首元素 |
c.back() | 访问容器尾元素 |
c.push_back(n) | 在容器末端插入数据n |
c.pop_back() | 删除容器末端数据 |
c[i] | 访问容器第i个元素 |
c.at(i) | 返回下标为i的元素 |
vector
第一部分:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> vec;
for(int i=0;i<10;i++)
{
vec.push_back(i);
}
for(unsigned int i=0;i<vec.size();i++) //看下边解释
{
cout<<vec.at(i)<<" "; //或者cout<<vec[i]<<" ";
}
cout<<endl;
cout << "长度 = " << vec.size() << endl;
/*------注意begin,end和front,back的用法区别-------*/
cout<<"vec.begin() = "<<*(vec.begin())<<endl<<"vec.end()-1 = "<<*(vec.end()-1)<<endl;
cout<<"vec.rbegin() = "<<*(vec.rbegin())<<endl<<"vec.rend()-1 = "<<" "<<*(vec.rend()-1)<<endl;
cout<<"vec.front() = "<<vec.front()<<endl<<"vec.back() = "<<vec.back()<<endl;
return 0;
}
输出:
0 1 2 3 4 5 6 7 8 9
长度 = 10
vec.begin() = 0
vec.end()-1 = 9
vec.rbegin() = 9
vec.rend()-1 = 0
vec.front() = 0
vec.back() = 9
解释:如果写for(int i=0;i<vec.size();i++)
会出现warning C4018: “<”: 有符号/无符号不匹配
。因为v是一个Vector容器 ,vec.size()
在容器说明中 被定义为unsigned int 类型,而i
是int类型 所以会出现警告。错误改正: 定义i
为unsigned类型后就可以了
第二部分:
1.声明 vector<数据类型> 变量名
例如vector<int> vec
vector<数据类型> 变量名(表长,初始数据)
例如vector<int> vec(10,0)
2.assign()函数
①void assign(const_iterator first,const_iterator last);
②void assign(size_type n,const T& x = T());
vec.assign(first,last)
相当于拷贝函数,把另一个容器的first到last的值赋值vec。vec.assign(n,x)
把n个x赋值给x。
3.
表达式、函数调用 | 属性 |
---|---|
size() | 返回容器的大小 |
max_size() | 返回容器最大的可以存储的元素 |
capacity() | 返回容器当前能够容纳的元素数量 |
size是当前vector容器真实占用的大小,也就是容器当前拥有多少个容器。
capacity是指在发生realloc前能允许的最大元素数,即预分配的内存空间。
更多可以戳→这里写链接内容和vector的capacity和size属性区别
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
void print(vector<int> v) //输出函数
{
for(unsigned int i=0;i<v.size();i++)
{
cout<<v.at(i)<<" ";
}
cout<<endl;
cout << "长度 = " << v.size() << endl;
}
int main()
{
vector<int> vec;
for(int i=0;i<20;i++)
{
vec.push_back(i);
}
print(vec);
vec.pop_back(); //弹出最后一个元素
print(vec);
vec.insert(vec.begin()+2,666);//插入
print(vec);
vec.erase(vec.begin()+5);//删除某一位置元素
print(vec);
vec.erase(vec.begin()+10,vec.begin()+15);//删除某一部分元素
print(vec);
vector<int> ano(14,2);//声明长度为14,初始化为2
print(ano);
ano.assign(4,1);
print(ano);
ano.assign(vec.begin(),vec.end());
print(ano);
cout<<"ano.capacity() = "<<ano.capacity()<<endl;
cout<<"ano.size() = "<<ano.size()<<endl;
cout<<"ano.max_size() = "<<ano.max_size()<<endl;
return 0;
}
输出 :
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
长度 = 20
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
长度 = 19
0 1 666 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
长度 = 20
0 1 666 2 3 5 6 7 8 9 10 11 12 13 14 15 16 17 18
长度 = 19
0 1 666 2 3 5 6 7 8 9 15 16 17 18
长度 = 14
2 2 2 2 2 2 2 2 2 2 2 2 2 2
长度 = 14
1 1 1 1
长度 = 4
0 1 666 2 3 5 6 7 8 9 15 16 17 18
长度 = 14
ano.capacity() = 14
ano.size() = 14
ano.max_size() = 1073741823