一、尺度容器
容器是尺度模板库(STL,standard template library)中的一个核心概念,它指的是那些能够存储和管理数据集合的类。容器的重要目的是提供一种机制,使得步调员可以存储一个元素集合,并以一种统一和高效的方式来处理这些元素,而不需要关心底层数据的具体存储细节。
1. 顺序容器
容器类名(顺序容器)容器名称array数组容器(C++11)forward_list单向链表容器(C++11)vector向量容器deque双端队列容器list双向链表容器vector
<ol>向量容器。
底层数据结构:动态开发的数组,每次以原来空间巨细的2倍进行扩容
vector vec;
常用方法
- 增加:
方法解释vec.push_back(20)末端添加元素,时间复杂度O(1),可以导致容器扩容vec.insert(it, 20)向迭代器位置插入元素,时间复杂度O(n)
- 删除:
方法解释vec.pop_back()删除末端元素 O(1)vec.erase(it)删除it迭代器指向的元素 O(n)
- 查询:
[table][tr]方法解释[/tr][tr][td]operator[][/td][td]通过下标随机访问 O(1)[/td][/tr][tr][td]iterator[/td][td]迭代器访问[/td][/tr][tr][td]find(vec.begin(), vec.end(), 3);[/td][td]不是成员方法,是泛型算法函数[/td][/tr][tr][td]for_each(vec.begin(), vec.end(), [] (auto it)->void {coutb; }}; // 二元函数对象的类int mmain(){
greator gre;
bool b = gre(1, 2); // 像调用函数一样使用函数对象- // 删除偶数
- auto it2 = vec.begin();
- while(it2!=vec.end())
- {
- if(*it2%2 == 0 )
- {
- it2 = vec.erase(it2); //更新迭代器。 erase删除迭代器指向的元素后,返回新的指向原来位置的迭代器。解释:迭代器指向12345中的4,删除了4后5前移到4的位置,返回的迭代器指向5
- }else
- {
- it2++;
- }
- }
复制代码 }
[/code]
- 如果一个类中重写了operator()运算符重载函数,那使用该类创建的对象称作函数对象,或者仿函数。这类对象可以调用函数的方式使用,而这样使用时实质是调用对象中的operator()运算符重载函数。
- 重要的作用的是替换C语言中的函数指针,函数对象(也称为functor)和函数指针都是回调机制的实现方式
- 利益
- 通过函数对象调用operator(),可以省略函数的调用开销,比通过函数指针调用(不能够inline内联调用)函数效率高。
- 因为函数对象是用类生成的,以是可以添加干系的成员变量,用来记载函数对象使用时的信息
- 实例
- class greator{public: bool operator()(const int a, const int b)const { return a>b; }}; // 函数对象的类int main() {
- using namespace std;
- priority_queue pque1; // 默认的优先级队列
- priority_queue pque2; // 通过模版中使用函数对象类改变优先级队列
- [code]for(int i=0; i<20; i++){ pque1.push(rand()%100+1); pque2.push(rand()%100+1);}auto length = pque1.size();for(int i=0; i<length; ++i){ cout<<pque1.top()<<' '; pque1.pop();}cout<<endl;for(int i=0; i<length; ++i){ cout<<pque2.top()<<' '; pque2.pop();}cout<<endl;// 删除偶数
- auto it2 = vec.begin();
- while(it2!=vec.end())
- {
- if(*it2%2 == 0 )
- {
- it2 = vec.erase(it2); //更新迭代器。 erase删除迭代器指向的元素后,返回新的指向原来位置的迭代器。解释:迭代器指向12345中的4,删除了4后5前移到4的位置,返回的迭代器指向5
- }else
- {
- it2++;
- }
- }
复制代码 }
[/code]- // 插入方式
- unordered_map<int, string> map1;
- map1.insert(make_pair(1, "aaa"));
- map1.insert({2, "bbb"});
- map1[3] = "ccc";
- // map1 = {
- {1, "aaa"},
- {2, "bbb"},
- }
复制代码 五、泛型算法
C++的泛型算法是C++尺度模板库(STL)中的一部分,它们是一组独立于任何特定容器的函数模板,可以在任何类型的容器上操作。泛型算法的核心思想是算法与数据容器分离,算法不依靠于容器的具体实现,而容器也不依靠于特定的算法。
- 泛型算法的重要特点
- 模板化:泛型算法通过模板参数接受任何类型的迭代器,使其能够适用于各种容器。
- 迭代器依靠:算法的操作仅依靠于迭代器,不依靠于容器的具体类型。
- 类型无关性:算法不关心容器中元素的具体类型,只关心元素可以被迭代器访问和操作。
- 头文件:#include
- 泛型算法的吸收的参数是迭代器和函数对象
- 常见的泛型算法:
- sort:对迭代器范围内的元素进行排序。
- swap:交换两个元素位置
- find:查找迭代器范围内第一个符合特定条件的元素。
- find_if:查找迭代器范围内满足if条件的元素
- copy:复制迭代器范围内元素到另一个容器。
- shuffle:打乱迭代器范围内元素顺序
- binary_search:在迭代器范围内二分查找一个元素
- reverse:反转迭代器范围内元素
- min:返回迭代器范围内最小值
- max:返回迭代器范围内最大值
- for_each:遍历迭代器范围内元素,并可以传入一个函数对象处理这个元素
- 补充:
- 非修改算法:
- std::find:查找第一个符合特定条件的元素。
- std::count:盘算某个值在范围内出现的次数。
- std::search:搜索子序列。
- 修改算法:
- std::copy:复制元素到另一个容器。
- std::fill:将某个值赋给一定范围内的所有元素。
- std::replace:替换范围内所有符合特定条件的元素。
- 排序和干系算法:
- std::sort:对范围内的元素进行排序。
- std::partial_sort:部分排序,确保范围的前N个元素是整个范围中最小的N个元素。
- std::nth_element:确保第N个位置的元素放置在排序后它应该在的位置。
- 集合算法:
- std::set_union:盘算两个集合的并集。
- std::set_intersection:盘算两个集合的交集。
- std::set_difference:盘算两个集合的差集。
- 配对算法:
- std::mismatch:查找两个序列中第一个不匹配的元素。
- std::equal:检查两个序列是否相等。
- 算术和数学算法:
- std::accumulate:盘算范围内所有元素的总和。
- std::inner_product:盘算两个序列元素的内积。
- std::transform:对范围内的每个元素应用给定的函数。
- 容器修改算法:
- std::erase:从容器中删除元素。
- std::remove:从序列中移除符合特定条件的元素。
- std::unique:移除序列中一连重复的元素。
- 查找和搜索算法:
- std::binary_search:在已排序的范围内进行二分查找。
- std::lower_bound:有序的情况下,找到大于即是给定值的第一个元素。使用二分查找
- std::upper_bound:有序的情况下,找到大于给定值的第一个元素。使用二分查找
- std::lower_bound和std::upper_bound的区别:
- template<class A, class B>
- struct pair
- {
- A first; // KEY
- B second; // VALUE
- {
复制代码 index1的值为1,即nums中第一个2的下标;index2的值为4,nums中3的下标,也是第一个大于2的元素的下标。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |