C++ STL笔记(一) 序列容器(vector | deque | list)

时间:2021-10-06 04:15:48

  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++ STL笔记(一) 序列容器(vector | deque | list)


序列容器的操作

表达式、函数调用 功能
c.front() 访问容器首元素
c.back() 访问容器尾元素
c.push_back(n) 在容器末端插入数据n
c.pop_back() 删除容器末端数据
c[i] 访问容器第i个元素
c.at(i) 返回下标为i的元素

vector

英文:C++ Reference

第一部分:

#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