C++STL简述
一、尺度容器容器是尺度模板库(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)
[*]查询:
方法解释operator[]通过下标随机访问 O(1)iterator迭代器访问find(vec.begin(), vec.end(), 3);不是成员方法,是泛型算法函数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++;
}
}}
[*]如果一个类中重写了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;// 通过模版中使用函数对象类改变优先级队列
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++;
}
}}
// 插入方式
unordered_map<int, string> map1;
map1.insert(make_pair(1, "aaa"));
map1.insert({2, "bbb"});
map1 = "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企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]