1. vector

1. 概念

vector是标准库中常见的一种容器,使用起来非常方便,可以用来代替c++原本的数组。vector也可以称为动态数组,因为其大小是根据实时更新而变化的,正因为如此vector显得更加灵活易用。

2. 用法

2.1 vector初始化

  • vector vec1; 创建空的vector容器,里面不包含任何元素
  • vector vec2(3); 创建指定数量元素的容器,如果是数值类型,则填充为0;如果是char类型,则以ascii码为0的字符填充(无意义);
  • vector vec2({'a','b','c'}); 用数组也可以初始化;ps:不能使用变量定义的数组
  • vector vec3(3,'a'); 指定数量元素用来初始化
  • vector vec4(vec3); 使用vec3来初始化vec4

2.2 遍历vector

    vector<int> ivec;
    for (int i = 0; i < 10; i++) {
        ivec.push_back(i);
    }
    //1.利用迭代器
    for (auto it = ivec.begin(); it != ivec.end(); ++it) {
        cout << *it << " ";
    }
    cout << endl;

    //2.利用下标操作符
    for (auto i = 0; i < ivec.size(); i++) {
        cout << ivec[i] << " ";
    }
    cout << endl;

    //3.利用范围for循环
    for (auto i : ivec) {
        cout << i << " ";
    }
    cout << endl;

2.3 vector中的常用操作

2.3.1 insert

  • v.insert(pos,elem); // 这里pos是一个迭代器,如v.begin() ,表示在pos处插入一个elem拷贝
  • v.insert(pos,n,elem); // 表示在pos处插入n个elem拷贝
  • v.insert(pos,beg,end); // 表示在pos位置插入在[beg, end) 区间的数据

2.3.2 erase

  • v.erase(pos) // 删除pos位置的数据,这里依然是一个迭代器,传回下一个数据的位置
  • v.erase(beg,end) //删除[beg,end) 区间的数据,传回下一个数据的位置
  • 除此之外,还可以用v.pop_back()删除尾部元素,用v.clear()清楚容器内容

2.3.3 front && back

顾名思义,返回容器开头或结尾元素

2.3.4 resize && size && capacity && reserve

  1. size指当前实际有多少元素,而capacity指该容器可以最多容纳多少个元素。由于vector是动态数组,因此,随着size增大,capacity也在不断增大
  2. resize 代表重新调整大小,如果resize的值小于当前元素个数,则删掉尾巴的多出的部分;如果多于当前容器内元素的数量,则多出的默认为0
  3. reserve代表设置capacity的值为多少,不常用,但是capacity的值不能小于size的值

2. deque

deque与vector非常相似。它也采用动态数组管理元素提供随机存取,有着和vector几乎一样的接口。不同的是deque的动态数组头尾都是开放的,因此能在头尾两端进行快速安插和删除。deque通常是作为一组独立区块,第一区块朝某方向扩展,最后一个区块朝另一个方向扩展。

deque与vector的主要不同之处在于:

  • 两端都能快速安插和删除元素,这些操作可以在分期摊还的常数时间内完成。
  • 元素的存取和迭代器比vector稍慢。
  • 迭代器需要在不同区块间跳转,所以它非一般指针。
  • 因为deque使用不止一块内存(而vector必须使用一块连续的内存),所以deque的max_size() 可能更大。
  • 不支持对容量和内存重新分配时机的控制。不过deque的内存重分配优于vector,因为其内部结构显示,deque不必在内存重分配时复制所有元素。
  • 除了头尾两端,在任何地方安插或删除元素,都将导致指向deque元素的所有pointers、references、iterators失效。
  • deque的内存区块不再被使用时,会自动释放。deque的内存大小是可自动缩减的。
  • deque与vector组织内存的方式不一样。在底层,deque按“页”或“块”来分配存储器,每页包含固定数目的元素。而vector只分配一块连续的内存。例如,一个10M字节的vector使用的是一整块10M字节的内存,而deque可以使用一串更小的内存块,比如10块1M的内存。所以不能将deque的地址(如&deque[0]) 传递给传统的API,因为deque内部所使用的内存不一定会连续

deque的下述特性与vector差不多:

  1. 在中部安插、删除元素的速度较慢。
  2. 迭代器属于 random access iterator (随机存取迭代器)。

优先使用vector还是deque?

c++标准建议:vector是应该在默认情况下使用的序列。如果大多数插入和删除操作发生在序列的头部或尾部时,应该选用deque。

使用deque还需注意:

  1. 除了at() ,其他成员函数均不会检查索引或迭代器是否有效。
  2. 任何插入或删除动作都会使所有指向deque元素的pointers、references、iterators失效,唯一例外的是在头部或尾部插入元素(此时pointers和references仍然有效,但iterators失效)

3. queue

queue<Type, Container> (<数据类型,容器类型>)

初始化时必须要有数据类型,容器可省略,省略时则默认为deque 类型

还可以使用list类型,但是最好不要用vector作为底层容器,因为queue要求两端都有插入和删除,而vector只在尾部进行相关操作效率比较高。

常用函数

push() 在队尾插入一个元素

pop() 删除队列第一个元素

size() 返回队列中元素个数

empty() 如果队列空则返回true

front() 返回队列中的第一个元素

back() 返回队列中最后一个元素

注意pop()没有返回值

4. list

直接见[C++中list详解_c++ list_愚蠢的土拨鼠。的博客-CSDN博客](https://blog.csdn.net/qq_44423388/article/details/126289452?ops_request_misc=%7B%22request%5Fid%22%3A%22168774933616800215057478%22%2C%22scm%22%3A%2220140713.130102334..%22%7D&request_id=168774933616800215057478&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-2-126289452-null-null.142^v88^insert_down28v1,239^v2^insert_chatgpt&utm_term=c%2B%2B list&spm=1018.2226.3001.4187)

最后修改:2023 年 06 月 26 日
如果觉得我的文章对你有用,请随意赞赏