c++ STL标准库容器

目录

1.STL(Containers)简介

2.STL容器

1.vector

1.1vector的定义方式

1.2vector的操作和遍历

 2.deque

2.1deque操作方式

 3.map

3.1map简介

 3.2map定义

3.3map操作

 4.栈

4.1栈的定义

 4.2栈的函数

3.总结 


1.STL(Containers)简介

STL(Standard Template Library)是C++标准库中的一个重要组成部分,它提供了一系列的模板类和函数,用于实现常用的数据结构和算法。STL的设计目标是提供高效、可复用的数据结构和算法,以便开发人员能够更加方便地进行软件开发。

STL主要包含以下几个组件:

  1. 容器(Containers):STL提供了多种容器,如vector、list、deque、set、map等。这些容器提供了不同的数据结构,以满足不同的需求。例如,vector是一个动态数组,list是一个双向链表,set是一个集合,map是一个键值对的映射。

  2. 迭代器(Iterators):迭代器是STL中用于遍历容器元素的一种抽象概念。通过使用迭代器,我们可以方便地对容器中的元素进行访问和操作。STL提供了多种类型的迭代器,如输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器。

  3. 算法(Algorithms):STL提供了大量的算法,如排序、查找、复制、删除、替换等。这些算法可以直接应用于STL容器,也可以应用于普通的数组或其他容器。使用STL算法可以大大简化代码的编写,并提高代码的可读性和可维护性。

  4. 函数对象(Function Objects):函数对象是一种可调用的对象,它可以像函数一样被调用。STL中的很多算法都可以接受函数对象作为参数,以实现不同的操作。STL提供了一些内置的函数对象,如加法、减法、乘法、除法等,同时也支持用户自定义的函数对象。

  5. 适配器(Adapters):适配器是一种特殊的容器或迭代器,可以改变容器或迭代器的接口,以适应不同的需求。STL提供了多种适配器,如栈(stack)、队列(queue)、优先队列(priority_queue)等。


2.STL容器

1.vector

vector底层本质就是一个顺序表,它是一个可变长的数组,采用连续存储的空间来存储数据,它的元素类型也可以是任意的内置类型或者自定义类型

1.1vector的定义方式

1.定义一个任意类型的空的vector

vector<int> abc;

 用法:关键字vector+<定义类型>+空格+名称

2.定义一个任意类型的vector,并用n个val来初始化vector

vector<int> a1(10, 5);// 用10个5来初始化vector

  用法:关键字vector+<定义类型>+空格+名称+定义

3.定义一个任意类型的vector,并用迭代器区间来初始化vector

vector<int> v5(v4.begin(), v4.end());// 用v4的迭代器区间来初始化v5
string s("hello world");
vector<char> v6(s.begin(), s.end());// 用s的迭代器区间来初始化v6

   用法:关键字vector+<定义类型>+空格+名称+变量-区间 

1.2vector的操作和遍历

v.capacity();  //容器容量

 v.size();      //容器大小

 v.at(int idx); //用法和[]运算符相同

 v.push_back(); //尾部插入

 v.pop_back();  //尾部删除

 v.front();     //获取头部元素

 v.back();      //获取尾部元素

 v.begin();     //头元素的迭代器

 v.end();       //尾部元素的迭代器

 v.insert(pos,elem); //pos是vector的插入元素的位置

 v.insert(pos, n, elem) //在位置pos上插入n个元素elem

 v.insert(pos, begin, end);

 v.erase(pos);   //移除pos位置上的元素,返回下一个数据的位置

 v.erase(begin, end); //移除[begin, end)区间的数据,返回下一个元素的位置

 vector类似于数组,可以直接下标遍历

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main()
{
    vector<int> v(10, 10);
    for (size_t i = 0; i < v.size(); i++)
    {
        v[i] += i;
        cout << v[i] << " ";
    }
    cout << endl;
    return 0;
}

 2.deque

2.1deque操作方式

   deque容器为一个给定类型的元素进行线性处理,像向量一样,它能够快速地随机访问任一个元素,并且能够高效地插入和删除容器的尾部元素。但它又与vector不同,deque支持高效插入和删除容器的头部元素,因此也叫做双端队列。deque类常用的函数如下。

(1)    构造函数

deque():创建一个空deque

deque(int nSize):创建一个deque,元素个数为nSize

deque(int nSize,const T& t):创建一个deque,元素个数为nSize,且值均为t

deque(const deque &):复制构造函数

(2)    增加函数

void push_front(const T& x):双端队列头部增加一个元素X

void push_back(const T& x):双端队列尾部增加一个元素x

iterator insert(iterator it,const T& x):双端队列中某一元素前增加一个元素x

void insert(iterator it,int n,const T& x):双端队列中某一元素前增加n个相同的元素x

void insert(iterator it,const_iterator first,const_iteratorlast):双端队列中某一元素前插入另一个相同类型向量的[forst,last)间的数据

(3)    删除函数

Iterator erase(iterator it):删除双端队列中的某一个元素

Iterator erase(iterator first,iterator last):删除双端队列中[first,last)中的元素

void pop_front():删除双端队列中最前一个元素

void pop_back():删除双端队列中最后一个元素

void clear():清空双端队列中最后一个元素

(4)    遍历函数

reference at(int pos):返回pos位置元素的引用

reference front():返回首元素的引用

reference back():返回尾元素的引用

iterator begin():返回向量头指针,指向第一个元素

iterator end():返回指向向量中最后一个元素下一个元素的指针(不包含在向量中)

reverse_iterator rbegin():反向迭代器,指向最后一个元素

reverse_iterator rend():反向迭代器,指向第一个元素的前一个元素

(5)    判断函数

bool empty() const:向量是否为空,若true,则向量中无元素

(6)    大小函数

Int size() const:返回向量中元素的个数

int max_size() const:返回最大可允许的双端对了元素数量值

(7)    其他函数

void swap(deque&):交换两个同类型向量的数据

void assign(int n,const T& x):向量中第n个元素的值设置为x

deque是“double-ended queue”的缩写,和vector一样都是STL的容器,唯一不同的是:

deque是双端数组,而vector是单端的。或者说deque是双链表,而vector是单链表

deque和vector定义和调用相差不多,如

deque <int> deqInt;            //存放int的deque容器。

deque <float> deqFloat;         //存放float的deque容器。

deque <student> deqStu;        //存放student的deque容器。

 


 3.map

3.1map简介

C++中的map是一种关联容器,它提供了一种将键和值进行映射的方式。每个键都是唯一的,而值可以重复。map内部使用红黑树实现,因此它具有自动排序的特性。以下是一个简单的示例来介绍C++中的map:

#include <iostream>
#include <map>

int main() {
    // 创建一个map对象
    std::map<int, std::string> myMap;

    // 向map中插入键值对
    myMap.insert(std::make_pair(1, "apple"));
    myMap.insert(std::make_pair(2, "banana"));
    myMap.insert(std::make_pair(3, "orange"));

    // 访问map中的元素
    std::cout << "Value at key 2: " << myMap[2] << std::endl;

    // 遍历map中的所有元素
    for (const auto& pair : myMap) {
        std::cout << "Key: " << pair.first << ", Value: " << pair.second << std::endl;
    }

    return 0;
}

 输出

Value at key 2: banana
Key: 1, Value: apple
Key: 2, Value: banana
Key: 3, Value: orange

 3.2map定义

map<类型,类型> 名字;

map关键字+<类型(键值)+类型(键值对应)> +名字


3.3map操作

定义:名称["键值"]="键值对应"

引用:名称["键值"]==键值对应

 列如:

#include<map>
#include<iostream>
using namespace std;
int main()
{
	map<string,string> m;
	m["张三的喜好"]="吃汉堡";
	cout<<"张三的喜好是 "<<m["张三的喜好"]; 
}

 4.栈

4.1栈的定义

stack<类型(可以不写)> 名字;
或者stack 名字;

 4.2栈的函数

.empty() 判断栈是否为空,空则返回true
.pop() 移除栈顶元素
.push(名字(或字符串)) 在栈顶增加元素
.size() 返回栈中元素数目
.top() 返回栈顶元素

3.总结 

通过使用STL,我们可以更加高效地开发C++程序。STL提供了丰富的数据结构和算法,可以大大减少代码的编写量,并提高代码的可读性和可维护性。同时,STL还具有良好的性能和可移植性,可以在不同的平台上进行开发和运行。

总结起来,STL是C++标准库中的一个重要组成部分,它提供了丰富的数据结构和算法,以及方便的容器、迭代器、算法、函数对象和适配器等组件。通过使用STL,我们可以更加高效地开发C++程序,并提高代码的可读性和可维护性。

(借鉴 C++STL容器总结_c++stl容器的特点-CSDN博客  C++关于vector的详细介绍_c++ vector-CSDN博客C++STL容器总结_c++stl容器的特点-CSDN博客   C++中deque用法详解_deque c++ 使用-CSDN博客

C++容器详解之deque_c++ deque-CSDN博客

c++STL库最详细介绍(保姆级教学)-CSDN博客

相关推荐

  1. c++ STL标准容器

    2024-01-18 00:38:02       59 阅读
  2. C++——STL标准模板——容器详解——vector

    2024-01-18 00:38:02       45 阅读
  3. C++——STL标准模板——容器详解——deque

    2024-01-18 00:38:02       44 阅读
  4. C++——STL标准模板——容器详解——set

    2024-01-18 00:38:02       52 阅读
  5. STL标准(三)序列容器之list

    2024-01-18 00:38:02       58 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-18 00:38:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-18 00:38:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-18 00:38:02       82 阅读
  4. Python语言-面向对象

    2024-01-18 00:38:02       91 阅读

热门阅读

  1. 6个Git实用技巧,让你事半功倍

    2024-01-18 00:38:02       58 阅读
  2. webpack 是什么?

    2024-01-18 00:38:02       52 阅读
  3. STM32 定时器输入捕获3——捕获超长高电平

    2024-01-18 00:38:02       51 阅读
  4. 2024,会更好嘛?

    2024-01-18 00:38:02       57 阅读
  5. 【个人笔记】ClickHouse 查询优化

    2024-01-18 00:38:02       56 阅读
  6. 【Flutter】多线程

    2024-01-18 00:38:02       49 阅读