首页 > 编程语言 > 详细

06、C++--STL库

时间:2021-02-16 18:19:30      阅读:33      评论:0      收藏:0      [点我收藏+]

C++ STL库

C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。

C++ 标准模板库的核心包括以下三个组件:

组件 描述
容器(Containers) 容器是用来管理某一类对象的集合。C++ 提供了各种不同类型的容器,比如 deque、list、vector、map 等。
算法(Algorithms) 算法作用于容器。它们提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作。
迭代器(iterators) 迭代器用于遍历对象集合的元素。这些集合可能是容器,也可能是容器的子集。

这三个组件都带有丰富的预定义函数,帮助我们通过简单的方式处理复杂的任务。

其中还包含了仿函数(Functor)、适配器(Adaptor)、分配器(allocator)等。

容器

STL中的容器有队列容器和关联容器,容器适配器(congtainer adapters:stack,queue,priority queue),位集(bit_set),串包(string_package)等等。

容器类自动申请和释放内存,无需new和delete操作。

序列式容器

序列式容器(Sequence containers)包含Vector、Deque、List等。

Vector:将元素置于一个动态数组中加以管理,可以随机存取元素(用索引直接存取),数组尾部添加或移除元素非常快速。但是在中部或头部安插元素比较费时;
Deque:是“double-ended queue”的缩写,可以随机存取元素(用索引直接存取),数组头部和尾部添加或移除元素都非常快速。但是在中部或头部安插元素比较费时;
List:双向链表,不提供随机存取(按顺序走到需存取的元素,O(n)),在任何位置上执行插入或删除动作都非常迅速,内部只需调整一下指针;

Vector

向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。

它的特性如下所示:

  • 顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素。

  • 支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。

  • 容器使用一个内存分配器对象来动态地处理它的存储需求。

Vector的基本函数实现:

1、构造函数

  • vector():创建一个空vector
  • vector(int nSize):创建一个vector,元素个数为nSize
  • vector(int nSize,const t& t):创建一个vector,元素个数为nSize,且值均为t
  • vector(const vector&):复制构造函数
  • vector(begin,end):复制[begin,end)区间内另一个数组的元素到vector中

2、增加函数

  • void push_back(const T& x):向量尾部增加一个元素X
  • iterator insert(iterator it,const T& x):向量中迭代器指向元素前增加一个元素x
  • iterator insert(iterator it,int n,const T& x):向量中迭代器指向元素前增加n个相同的元素x
  • iterator insert(iterator it,const_iterator first,const_iterator last):向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据

3、删除函数

  • iterator erase(iterator it):删除向量中迭代器指向元素
  • iterator erase(iterator first,iterator last):删除向量中[first,last)中元素
  • 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:判断向量是否为空,若为空,则向量中无元素

6、大小函数

  • int size() const:返回向量中元素的个数
  • int capacity() const:返回当前向量所能容纳的最大元素值
  • int max_size() const:返回最大可允许的vector元素数量值

7、其他函数

  • void swap(vector&):交换两个同类型向量的数据
  • void assign(int n,const T& x):设置向量中前n个元素的值为x
  • void assign(const_iterator first,const_iterator last):向量中[first,last)中元素设置成当前向量元素

创建一个实例对数组进行插入、移除、清空和排序等操作。

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int main() {
  vector<int> vec;
  for (int i = 0; i < 10; ++i) {
    int random = rand() % 100;
    vec.push_back(random);
    cout << vec[i] << ", ";
  }

  vec.pop_back(); // 移除数组最后一个数据

  cout << endl;
  // Vector数据进行排序
  cout << "从小到大排序输出:" << endl;
  sort(vec.begin(), vec.end());
  for (int i = 0; i < vec.size(); ++i) {
    cout << vec[i] << ", ";
  }
  cout << endl;
  cout << "从大到小排序输出:" << endl;
  reverse(vec.begin(), vec.end());
  for (int i = 0; i < vec.size(); ++i) {
    cout << vec[i] << ", ";
  }
 }

运行上面的程序,输出结果如下:

41, 67, 34, 0, 69, 24, 78, 58, 62, 64,
从小到大排序输出:
0, 24, 34, 41, 58, 62, 67, 69, 78,
从大到小排序输出:
78, 69, 67, 62, 58, 41, 34, 24, 0,

其中vector除了直接通过下标访问数组外,还可以通过迭代器的方式访问:

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

int main() {
    vector<int> vec;
    for (int i = 0; i < 10; ++i) {
        int random = rand() % 100;
        vec.push_back(random);
    }
    cout << endl;
    // 利用迭代器取出数组元素
    vector<int>::iterator it;
    for (it = vec.begin(); it != vec.end(); it++) {
        cout << *it << ", ";
    }
}

如果是二维数组,有两种定义方式:

1) 定义方式一

#include <iostream>
#include <vector>

using namespace std;
int main(){
    int N = 5, M = 6;
    vector<vector<int> > vec(N); //定义二维动态数组大小5行
    for (int i = 0; i < vec.size(); i++) {
        vec[i].resize(M);
    }

    for (int i = 0; i < vec.size(); i++) { //输出二维动态数组 
        for (int j = 0; j < vec[i].size(); j++) {
            cout << vec[i][j] << ",";
        }
        cout << endl;
    }
}

2)定义方式二

#include <iostream>
#include <vector>
using namespace std;
int main() {
    int N = 5, M = 6;
    vector<vector<int> > vec(N, vector<int>(M));
    for (int i = 0; i < vec.size(); i++) {
        for (int j = 0; j < vec[i].size(); j++) {
            cout << vec[i][j] << " ";
        }
        cout << endl;
    }
}

关联式容器

关联式容器(Associated containers)包含Set/Multiset、Map/Multimap等。

Set/Multiset:内部的元素依据其值自动排序,Set内的相同数值的元素只能出现一次,Multisets内可包含多个数值相同的元素,内部由二叉树实现,便于查找;
Map/Multimap:Map的元素是成对的键值/实值,内部的元素依据其值自动排序,Map内的相同数值的元素只能出现一次,Multimaps内可包含多个数值相同的元素,内部由二叉树实现,便于查找;

06、C++--STL库

原文:https://www.cnblogs.com/pengjingya/p/14406941.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!