STL--容器

一、vector容器

1、

存放内置数据类型

  • 创建容器 :vector<数据类型> v;
  • 插入数据:push_back();v.insert();v.assign();
  • 尾部删除:pop_back();v.erase();
  • 指向容器中第一个元素:v.begin();
  • 指向容器中第一个元素前一个:v.rbegin();
  • 指向容器中最后一个元素下一个位置:v.end();
  • 指向容器中最后一个元素:v.rend();
  • 容器交换:容器1.swap(容器2);
  • 数据存取:at();[];front();back();
  • 预留空间:v.reserve();
  • 通过迭代器访问数据:vector<数据类型>::iterator
  • STL内置的遍历算法:for_each(_InputIterator __first, _InputIterator __last, _Function __f)   _InputIterator __first指容器中第一个元素,_InputIterator __last表示容器中最后一个元素下一个位置,_Function __f为自定义函数

代码示例:

    vector<int> v; //创建容器
    //通过puch_back()插入数据
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);

①、通过while循环遍历

 //通过迭代器访问数据
    vector<int>::iterator itBegin = v.begin(); //指向容器中第一个元素
    vector<int>::iterator itEnd = v.end(); //指向容器中最后一个元素下一个位置
    
    while (itBegin != itEnd)
    {
        cout << *itBegin << endl; // 解引用输出数据
        itBegin  ++;
    }

②、通过for循环遍历

    for ( vector<int>::iterator itBegin = v.begin(); itBegin != itEnd; itBegin ++)
    {
        cout << *itBegin << endl;
    }

③、通过STL内置的for_each算法遍历

void print(int i)
{
    cout << i << endl;
}
//利用STL的算法for_each
for_each(v.begin(), v.end(), print);

2、存放自定义数据类型

原理与上述一致,没太大区别,示例代码如下

#include <iostream>
using namespace std;
#include <string>
#include <vector>
#include <algorithm>

//自定义数据类型Person
class Person
{
public:
    Person(string name, int age)
    {
        this->name = name;
        this->age = age;
    }
public:
    int age;
    string name;
};

void test()
{
    vector<Person> v;
    //定义数据
    Person p1("Tom", 11);
    Person p2("Jack", 12);
    Person p3("acsi", 18);
    //向容器中插入数据
    v.push_back(p1);
    v.push_back(p2);
    v.push_back(p3);

    //遍历数据
    for(vector<Person>::iterator itBegin = v.begin(); itBegin != v.end(); itBegin ++)
    {
        cout << (*itBegin).name << " " << (*itBegin).age << endl;
    }
}

int main()
{
    test();
    return 0;
}

3、vector的嵌套

vector容器内也可存放小容器,即为容器嵌套

vector<vector<int>> v;

二、string容器

1、函数构造

  • string();//创建一个空字符串
  • string(const char* s);//使用字符串s初始化
  • string(const string& str);//使用另外一个string对象初始化
  • string(int n,char c);//使用n个字符c初始化

2、其它操作

  • 字符存取:[]或者at  
  • 插入:insert()
  • 删除:erase()
  • 获取子串:substr()

三、deque容器

  • 头部插入/删除:push_front();pop_front();
  • 尾部插入/删除:push_back();pop_back();
  • 第一个/最后一个元素:front();back();
  • 迭代器:begin();end();
  1. 要限制容器可读,迭代器也要设置为可读 
  2. 构造、数据存取和赋值与vector类似 
  3. 排序:利用STL的sort()算法,默认升序
    sort(d.begin(), d.end());

 四、stack容器

特点:先进后出,单端容器

接口:

构造函数:

  • stack<数据类型> stk;
  • stack(const stack &stk)       //拷贝构造函数

赋值:

stack& operator=(const stack &stk)     //重载等号运算符

数据存取: 

入栈:push(elem)

出栈:pop()

反悔栈顶元素:top()

五、queue容器

特点 :先进先出,双端容器,只能对尾进,对头出

接口:

构造函数和赋值与stack一致;

数据存取:

  • 入队:push(elem)
  • 出队:pop()
  • 返回最后一个元素:back()
  • 返回第一个元素:front()

 六、list容器

特点:链式存储,非连续空间。一个节点由数据域和指针域构成,指针域为双向的,既指向下一个节点,也记录前一个节点。这种结构使得在任意位置插入和删除数据变得高效、遍历速度慢、占用空间大,不支持随机访问,需调用成员函数0

接口:与前面容器一致,下面是新增的接口

remove(elem):删除容器中与elem相匹配的元素

reverse():反转

L.sort():排序,对于自定义数据类型,需制定规则接口

七、set/multiset容器

特点:所有元素在插入时会自动排序,set不允许有重复元素,multiset允许

接口:

构造和赋值操作与其它容器一致

不同的是插入数据只有insert()操作,删除数据只有erase()。

 在存放自定义数据类型时应该先制定数据排序规则(仿函数),不然编译器不知道怎么排序

下面自定义了一个Person类,并存放在set容器中,按照年龄进行排序

#include <iostream>
using namespace std;
#include <string>
#include <vector>
#include <algorithm>
#include <deque>
#include <set>

class Person
{
public:
    Person(string name, int age)
    {
        this->name = name;
        this->age = age;
    }

public:
    int age;
    string name;
};

//制定仿函数排序规则,按照年龄降序排序
class ComparePerson
{
public:
    //返回值是bool类型
    bool operator()(const Person&p1, const Person&p2)const
    {
        return p1.age > p2.age;
    }
};


void test()
{

    set<Person, ComparePerson>s;//在定义集合之前将仿函数传入
    //定义数据
    Person p1("jack", 18);
    Person p2("manky", 20);
    Person p3("Tom", 21);
    Person p4("sin", 22);
    //插入数据
    s.insert(p1);
    s.insert(p2);
    s.insert(p3);
    s.insert(p4);

    for(set<Person, ComparePerson>::iterator itBegin = s.begin(); itBegin != s.end(); itBegin++)
    {
        cout << (*itBegin).name << " " << (*itBegin).age << endl;
    }
}
int main()
{
    test();
    return 0;
}

 七、map/multimap容器

特点:所有元素都是pair,第一个值为key,第二个为value,会安装key自动排序,如果要修改排序规则则与list一样自己定义仿函数

map不允许有重复key值,而multimap允许

接口:

构造和赋值与之前容器一致

    map<int, int>m;
    //插入数据
    m.insert(pair<int, int>(1,10));
    m.insert(pair<int, int>(2,20));
    m.insert(pair<int, int>(3,30));

    for (map<int, int>::iterator it = m.begin(); it!=m.end(); it++)
    {
        cout << (*it).first << " " << (*it).second << endl;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值