C++ STL学习总结

C++ STL 学习体会 STL的设计目标,是将不同的算法和数据结构结合在一起,并获取 阅读详情

C++ STL的三大组件:Containers, Iterators, Algorithms,即容器,迭代器和算法。容器负责存储数据,算法负责计算结果,而算法调用容器的数据必须通过迭代器去访问,而每一种容器都提供了一种访问该容器中数据的迭代器。STL主要提供有两类容器跟容器适配器,两类容器分别为:序列式容器<向量(vector)、双端队列(deque)、链表(list)>以及关联式容器<集合(set(multiset))及映射(map(multimap))>;容器适配器为:栈(stack)和队列(queue),容器的示意图如下图所示:

基本接口

vector

特点:
 (1)拥有一段连续的内存空间,因此它能非常好的支持随机访问,即 [] 操作符和 .at(),随机访问快。(优点)
 (2)当向其头部或中间插入或删除元素时,为了保持原本的相对次序,插入或删除点之后的所有元素都必须移动,所以插入或删除的效率比较低。(缺点)
 (3)在后面插入删除元素最快,此时一般不需要移动内存。(优点)
总结:相当于可拓展的数组(动态数组),随机访问快,在头部和中间插入或删除效率低,但在尾部插入或删除效率高。

基本操作:
    v.empty();        // 判断容器是否为空
    v.capacity();    // 容器容量
    v.size();        // 容器大小
    v.at(int idx);    // 用法和[]运算符相同
    v.front();        // 获取头部元素
    v.back();        // 获取尾部元素
    v.begin();        // 头元素的迭代器
    v.end();        // 尾部元素的迭代器
    v.push_back(elem);    // 尾部插入
    v.pop_back();    // 尾部删除
    v.insert(pos, elem);    //在位置pos插入elem元素
    v.insert(pos, n, elem);    //在位置pos上插入n个元素elem
    v.insert(pos, begin, end);    //在位置pos上插入begin至end区间的数据
    v.erase(pos);            //移除pos位置上的元素,返回下一个数据的位置
    v.erase(begin, end);    //移除[begin, end)区间的数据,返回下一个元素的位置
    v.clear();        // 清空元素
    v.swap(vec);    // 将vec与自身元素互换
    v.reseve(int len);    //预留空间,由于每次往vector中添加元素时都会检查空间是否够用,不够就会重新换一块大的内存,这样耗时耗力。

deque

特点:
(1)一旦要在 deque 的头部和尾部增加新空间,便配置一段定量连续空间,串在整个 deque 的头部或尾部,因此不论在头部或尾部插入元素都十分迅速。 (优点)
(2)在中间部分安插元素则比较费时,因为必须移动其它元素。(缺点)
(3)deque 是 list 和 vector 的折中方案。兼有 list 的优点,也有 vector 随机访问效率高的优点。
总结:支持随机访问,但效率没有 vector 高,在头部和尾部插入或删除效率高,但在中间插入或删除效率低。

基本操作:deque几乎支持vector所以的操作,但由于daque是双向队列可以双向插入跟删除,所以都有自己独有的两个操作如下:
    d.push_front(elem);    //头部插入
    d.pop_front();    //头部删除

list

特点:
(1)内存空间可以是不连续的,通过指针来进行数据的访问,这个特点使得它的随机存取变得非常没有效率,因此它没有提供 [] 操作符的重载。(缺点)
(2)由于链表的特点,在任意位置的插入和删除效率都较高。(优点)
(3)只支持首尾两个元素的直接存取,想获取其他元素(访问时间一样),则需要遍历链表。(缺点)
总结:不支持随机访问,在任意位置的插入和删除效率都较高。

基本操作:
    l.size();      // 链表大小
    l.empty();        // 判断链表是否为空
    l.resize(num);    // 重新制定链表长度,若长度比之前大,则用默认值填充,若小于之前大小,则超出的元素被删除
    l.resize(num, elem);        // 指定值填充
    l.front();                    // 返回第一个元素
    l.back();                    // 返回最后一个元素
    l.begin();                    // 头元素的迭代器
    l.end();                    // 尾部元素的迭代器
    l.push_back(elem);             // 尾部插入
    l.pop_back();                  // 尾部删除
    l.push_front(elem);            // 头部插入
    l.pop_front();                // 头部删除
    l.insert(pos,elem);            // 在位置pos插入elem元素
    l.insert(pos, n, elem)        // 在位置pos上插入n个元素elem
    l.insert(pos, begin, end);    // 在位置pos上插入begin至end区间的数据
    l.erase(pos);                  // 移除pos位置上的元素,返回下一个数据的位置
    l.erase(begin, end);        // 移除[begin, end)区间的数据,返回下一个元素的位置
    l.clear();            // 清空元素
    l.remove(elem);        // 删除容器中所有与elem匹配的元素
    l.swap(lst);        // 将lst与自身元素互换
    l.reverse();        // 链表反转
    l.sort();            // 链表排序,默认升序,如果不为升序许自己实现排序规则

注:不支持随机访问的迭代器的容器不可以用标准算法,其内部会提供对应的一些算法(比如排序算法)。

set(multiset) 

特点:
(1)使用红黑树实现,其内部元素依据其值自动排序,set中每个元素值只能出现一次,不允许重复,multiset中元素可以重复。
(2)每次插入值的时候,都需要调整红黑树,效率有一定影响。(缺点)
(3)map(multimap)  和 set(multiset)  的插入或删除效率比用其他序列容器高,因为对于关联容器来说,不需要做内存拷贝和内存移动。(优点)
总结:由红黑树实现,其内部元素依据其值自动排序,且插入和删除效率比用其他序列容器高。

基本操作:
    s.size();      // 容器大小
    s.empty();        // 判断容器是否为空
    s.find(key);                // 返回元素的迭代器
    s.count(key);                // 返回元素的个数
    s.insert(elem);                // 插入elem元素
    s.erase(pos);                  // 移除pos迭代器所指的位置
    s.erase(begin, end);        // 移除[begin, end)区间的数据,返回下一个元素的位置
    s.erase(elem);              // 删除容器中所有与elem匹配的元素
    s.clear();            // 清空元素
    s.swap(set);        // 将set与自身元素互换

map(multimap) 

特点:
(1)map中每个元素都有一个键,且只能出现一次,不允许重复。而multimap中可以出现重复键值。
(2根据 key 值快速查找记录,查找的复杂度基本是 O(logN),如果有 1000 个记录,二分查找最多查找 10次(1024)。(优点)
(3)每次插入值的时候,都需要调整红黑树,效率有一定影响。(缺点)
(4)增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。(优点)
(5)对于迭代器来说,可以修改实值,而不能修改 key。
总结:元素为键值对,key 和 value 可以是任意你需要的类型,根据 key 快速查找记录。 

基本操作:
    m.size();                // 容器大小
    m.empty();                // 判断容器是否为空
    m.find(key);            // 返回元素的迭代器
    m.count(key);            // 返回元素的个数
    m.insert(elem);            // 插入elem元素
    m.erase(pos);              // 移除pos迭代器所指的位置
    m.erase(begin, end);     // 移除[begin, end)区间的数据,返回下一个元素的位置
    m.erase(elem);             // 删除容器中所有与elem匹配的元素
    m.clear();              // 清空元素
    m.swap(set);            // 将set与自身元素互换

基本操作案例

将STL的容器及其常用的算法做了如下案例测试,具体代码如下所示:

/**************************************
作   者 : lijd
生成日期 : 2021年03月02日
功能描述 : C++中STL容器、算法基本操作测试
**************************************/ 
#include <iostream>
#include <string>
using namespace std;

#include <vector>
#include <list>
#include <set>
#include <map>
#include <algorithm>
#include <numeric>
#include <functional>
#include <ctime>

// 自定义函数输出
void lijd_print(int val)
{
    cout<< val <<" ";
}

// 仿函数类模板打印输出
template <class T>
class MyPrint
{
public:
    void operator()(T val)
    {
	cout<< val <<" ";
    }
};

void test01()
{
    cout<<"----------------------------------------test 01--------------------------------------"<<endl;
    vector<int>	v1;
    // 生产随机种子
    srand((unsigned int)time(NULL));

    for(int i = 0; i < 10; i++)
    {
	v1.push_back(rand()%50);
    }
    cout << "排序前:" << endl;
    // 调用用户定义函数打印
    for_each(v1.begin(), v1.end(), lijd_print);
    cout << endl;

    cout<<"集合中元素的总和为:"<<accumulate(v1.begin(), v1.end(), 0/*基础累加值*/)<<endl;

    // sort默认从小到大排序,调用了关系仿函数 template <class T> less<T>
    sort(v1.begin(), v1.end());
    cout << "从小到大排序后:" << endl;
    // 调用用户自定义仿函数打印
    for_each(v1.begin(), v1.end(), MyPrint<int>());
    cout << endl;

    // 1、sort的最后一个参数是谓词(返回值为bool的仿函数),下面例子为其创建一个模板类实例化的匿名对象
    // 2、functional提供了一堆基于模板的比较函数对象:equal_to<Type>、not_equal_to<Type>、
    // greater<Type>、greater_equal<Type>、less<Type>、less_equal<Type>
    sort(v1.begin(), v1.end(), greater<int>());
	
    cout << "从大到小排序后:" << endl;
    for_each(v1.begin(), v1.end(), MyPrint<int>());
    cout << endl;
}

class Person
{
    friend ostream& operator<<(ostream &p_cout, Person &p);
public:
    Person(string name, int age):s_name(name), s_age(age){};

    int GetAge(){return this->s_age;};

    // 排序的时候需要调用my_sort_desc仿函数及list自带的sort函数,两者都需要重载 <
    // functional提供的模板类的谓词必须为const函数
    bool operator<(const Person &p) const
    {
	return (this->s_age < p.s_age ? true : false);
    };

    // 排序时调用list自带的sort函数时参数为谓词greater需要重载 >;
    bool operator>(const Person &p) const
    {
	return (this->s_age > p.s_age ? true : false);
    };

    // set集合调用find查找时需要重载==
    bool operator==(const Person &p) const
    {
	return (this->s_age == p.s_age ? true : false);
    }

private:
    string s_name;
    int s_age;
};

// 输出需要调用MyPrint仿函数,需重载"<<"
ostream& operator<<(ostream &p_cout, Person &p)
{
    p_cout<<"name:"<<p.s_name<<" age:"<<p.s_age<<"; ";
    return p_cout;
};

// 仿函数类模板年龄从大到小
template <class T>
class my_sort_desc
{
public:
    bool operator()(T val1, T val2) const
    {
	return val1 > val2;
    }
};

// 仿函数类模年龄从大到小
class age_great_num
{
public:
    age_great_num(int num):s_num(num){};
    bool operator()(Person &p) const
    {
	return p.GetAge() > this->s_num;
    }
private:
    int s_num;
};

void test02()
{
    cout<<"----------------------------------------test 02--------------------------------------"<<endl;
    cout<<"---------------------vector 测试---------------------"<<endl;
    vector<Person> v1;
    v1.push_back(Person("唐僧", 30));
    v1.push_back(Person("孙悟空", 1000));
    v1.push_back(Person("猪八戒", 900));
    v1.push_back(Person("沙和尚", 800));

    cout<<"vector 排序前:"<<endl;
    for_each(v1.begin(), v1.end(), MyPrint<Person>());
    cout<<endl;

    cout<<"vector 从小到大排序后:"<<endl;
    // 调用系统自带的less<T>模板类
    sort(v1.begin(), v1.end(), less<Person>());
    for_each(v1.begin(), v1.end(), MyPrint<Person>());
    cout<<endl;
    cout<<"---------------------list 测试---------------------"<<endl;

    // 注:不支持随机访问的迭代器的容器不可以用标准算法,其内部会提供对应的一些算法(比如排序算法)
    list<Person> lst;
    lst.push_back(Person("唐僧", 30));
    lst.push_back(Person("孙悟空", 1000));
    lst.push_back(Person("猪八戒", 900));
    lst.push_back(Person("沙和尚", 800));

    cout<<"list 排序前:"<<endl;
    for_each(lst.begin(), lst.end(), MyPrint<Person>());
    cout<<endl;

    // list需要调用自带sort排序,默认调用less仿函数,该参数调用自己实现的my_sort_desc<T>模板类
    lst.sort(my_sort_desc<Person>());

    cout<<"list 从大到小排序后:"<<endl;
    for_each(lst.begin(), lst.end(), MyPrint<Person>());
    cout<<endl;
}

void test03()
{
    cout<<"----------------------------------------test 03--------------------------------------"<<endl;
    set<int> s1;	// 如果为内置数据类型,默认有序,从小到大
	
    // 生产随机种子
    srand((unsigned int)time(NULL));

    for(int i = 0; i < 10; i++)
    {
	s1.insert(rand()%50);
    }
    cout<<"set 插入内置数据类型从小到大:"<<endl;
    for_each(s1.begin(), s1.end(), MyPrint<int>());
    cout<<endl;

    // 此处定义multiset自定义数据类型,年龄从大到小;尝试过用set年龄相同的会去重!
    multiset<Person, greater<Person>> myset;	
    myset.insert(Person("唐僧", 30));
    myset.insert(Person("孙悟空", 1000));
    myset.insert(Person("猪八戒", 900));
    myset.insert(Person("沙和尚", 800));
    myset.insert(Person("红孩儿", 500));
    myset.insert(Person("牛魔王", 1200));
    myset.insert(Person("白骨精", 800));
    myset.insert(Person("玉皇大帝", 1000));

    cout<<"set 插入自定义数据类型年龄从大到小:"<<endl;
    for_each(myset.begin(), myset.end(), MyPrint<Person>());
    cout<<endl;

    multiset<Person, greater<Person>>::iterator it = find(myset.begin(), myset.end(), Person("二郎神", 900));
    if(it != myset.end())
    {
	cout<<"find 查找到与二郎神年龄相同的为:"<<*it<<endl;
    }
	
    // 最后一个参数为其创建一个实例化的匿名对象
    it = find_if(myset.begin(), myset.end(), age_great_num(Person("王母娘娘", 500).GetAge()));
    if(it != myset.end())
    {
	cout<<"find_if 查找第一个年龄大于王母娘娘的为:"<<*it<<endl;
    }

    int num = count(myset.begin(), myset.end(), Person("太白金星", 800));
    cout<<"count 查找与太白金星年龄相同的个数有:"<<num<<endl;

    num = count_if(myset.begin(), myset.end(), age_great_num(Person("太白金星", 800).GetAge()));
	cout<<"count 查找比太白金星年龄大的个数有:"<<num<<endl;

    // 生产随机种子
    srand((unsigned int)time(NULL));

    // 定义key值从大到小的map对象
    map<int, Person, greater<int>> m1;
    m1.insert(make_pair(rand()%50, Person("唐僧", 30)));
    m1.insert(make_pair(rand()%50, Person("孙悟空", 1000)));
    m1.insert(make_pair(rand()%50, Person("猪八戒", 900)));
    m1.insert(make_pair(rand()%50, Person("沙和尚", 800)));

    cout<<"map m1的元素遍历为:"<<endl;
    map<int, Person, greater<int>>::iterator it1;
    for(it1 = m1.begin(); it1 != m1.end(); it1++)
    {
	cout<<"key: "<<it1->first<<" value: ["<<it1->second<<"]"<<endl;
    }

    map<int, Person> m2;
    m2.insert(make_pair(rand()%50, Person("红孩儿", 500)));
    m2.insert(make_pair(rand()%50, Person("牛魔王", 1200)));
    m2.insert(make_pair(rand()%50, Person("白骨精", 800)));
    m2.insert(make_pair(rand()%50, Person("玉皇大帝", 1000)));

    cout<<"map m2的元素遍历为:"<<endl;
    map<int, Person>::iterator it2;
    for(it2 = m2.begin(); it2 != m2.end(); it2++)
    {
	cout<<"key: "<<it2->first<<" value: ["<<it2->second<<"]"<<endl;
    }
}

void test04()
{
    cout<<"----------------------------------------test 04--------------------------------------"<<endl;

    vector<int> v1, v2, vtag;
    for(int i = 0; i < 10; i++)
    {
	v1.push_back(i);
	v2.push_back(i+5);
    }

    cout<<"v1 数据元素:"<<endl;
    for_each(v1.begin(), v1.end(), MyPrint<int>());
    cout<<endl;

    cout<<"v2 数据元素:"<<endl;    
    for_each(v2.begin(), v2.end(), MyPrint<int>());
    cout<<endl;

    // 目标集合申请空间    
    vtag.resize(min(v1.size(), v2.size()));
    vector<int>::iterator itEnd = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), vtag.begin());
    	
    cout<<"v1 和 v2 集合的交集为:"<<endl;
    for_each(vtag.begin(), itEnd, MyPrint<int>());
    cout<<endl;

    vtag.resize(v1.size() + v2.size());
    itEnd = set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), vtag.begin());

    cout<<"v1 和 v2 集合的并集为:"<<endl;
    for_each(vtag.begin(), itEnd, MyPrint<int>());
    cout<<endl;

    vtag.resize(v1.size());
    itEnd = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), vtag.begin());

    cout<<"v1 和 v2 集合的非集为(v1中存在v2不存在):"<<endl;
    for_each(vtag.begin(), itEnd, MyPrint<int>());
    cout<<endl;

    swap(v1, v2);
    cout<<"交换后 :"<<endl;
    cout<<"v1 数据元素:"<<endl;
    for_each(v1.begin(), v1.end(), MyPrint<int>());
    cout<<endl;

    cout<<"v2 数据元素:"<<endl;
    for_each(v2.begin(), v2.end(), MyPrint<int>());
    cout<<endl;
}

int main()
{
    test01();
    test02();
    test03();
    test04();

    system("pause");
    return 0;
}

运行结果如下图:

 

【c++20】CPP-20-STL-Cookbook 学习笔记 c++20 阅读详情

相关推荐

嵌入式开发语言-C语言编程

C语言编程概述环境在Windows上构建C语言的环境安装在Mac上构建C语言的环境安装 概述 “C语言”被称为适合嵌入式系统开发的编程语言之一。 C语言在一般的编程中也是熟悉的开发语言,但实际上,如果试着使用C语言制作微型计算机的控制程序等,就必须使用与“普通的C程序”不同的使用方法。 作为一般的C语言的学习方法,使用“printf”“scanf”等标准函数的程序开发是固定的,但这些都是以UNIX和Windows等环境上的应用程序开发为前提的。 对此,没有显示器和键盘的嵌入式系统的微型计算机控制程序,该如何

编程老王 7976

STL之三大组件:容器、算法、迭代器

STL(Standard Template Library,标准模板库) STL从广义上分为:容器(container) 算法(algorithm) 迭代器(iterator) 容器和算法之间通过迭代器进行无缝连接 STL六大组件: 容器:各种数据结构,如vector、list、deque、set、map等 算法:如sort、find、copy、for_each 迭代器:扮演了容器与算法之间的胶合...

weixin_44060964的博客 790

开发者体验度量:构建DevEx评估体系的方法论与工具

在深入讨论度量方法前,我们需要明确什么是开发者体验(DevEx)。许多人将其简化为"开发工具好不好用",这是一个危险的误解。开发者体验是指开发者在完成工作过程中的整体感受和效率,它由三大核心维度组成:工具与基础设施:开发、测试、部署工具链的效能流程与协作:工作流程的顺畅度和团队协作的效率文化与成长:支持实验、学习和专业发展的环境这三个维度相互作用,共同决定了开发者能否高效且愉悦地完成工作。开发者体验不是一个目的地,而是一段持续的旅程。

2401_88760782的博客 1429

C++之vector容器初学(二)——插入和删除

插入操作: 理论知识 ² vector.insert(pos,elem);   //在pos位置插入一个elem元素的拷贝,返回新数据的位置。 ² vector.insert(pos,n,elem);   //在pos位置插入n个elem数据,无返回值。 ² vector.insert(pos,beg,end);   //在pos位置插入[beg,end)区间的数据,无返回值  简单案例

sum_TW的博客 5万+

【DaVinci Developer实战指南】从入门到精通:软件组件设计与配置全解析

本文详细解析了DaVinci Developer在汽车电子开发中的核心应用,从软件组件设计到配置实战,涵盖Application SWC创建、RunnableEntity设计及Exclusive Area配置等关键环节。通过实际案例分享,帮助开发者快速掌握AUTOSAR架构下的ECU软件开发技巧,提升工作效率与系统稳定性。

weixin_30952535的博客 248

DDR的Controller、Channel、Chip、Rank、Bank、Row、Column、Sided、Dimm

DDR的Controller、Channel、Chip、Bank、Rank、Row、Column、Sided、Dimm

张飞online博客 2万+

C++中的STL简介详细讲解

什么是STL STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。 STL的版本 1.原始版本 Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意 运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使 用。 HP 版本–所有STL实现版本的始祖 2.P. J. 版本 由P. J.

qq_44819750的博客 792

【小白教程】本地部署VLM-R1模型(使用Docker)

通过Docker本地部署VLM-R1大模型,详细教程。

m0_69855053的博客 2937

C++ STL - 学习笔记

gcc 和 g++ 是GNU Compiler Collection(GNU编译器集合)中的两个关键组件,专门用于编译C语言和C++语言的程序。本篇博客用来记录我在学习 C++ 的 STL 过程的笔记以及问题。在 VSCode 中,C/C++ 插件安装失败,报错。3、检查结果,关闭 VSCode 后打开。在 VSCode 的终端中,执行。没有安装 gcc 和 g++删除插件后再安装,问题解决。插件安装因为未知原因失败。无法获取到正常的结果。1、安装 Mingw。2、然后配置环境变量。

qq_39748832的博客 1319

构建面向嵌入式Linux的ARM64交叉编译工具链:从sysroot配置到CMake实战

本文详细介绍了如何构建面向嵌入式Linux的ARM64交叉编译工具链,从sysroot配置到CMake实战。通过分步指导,帮助开发者解决架构不一致问题,提升编译效率,特别适用于树莓派等ARM64设备开发。文章涵盖sysroot机制、环境搭建、CMake配置及常见问题解决方案,是嵌入式开发的实用指南。

weixin_42537142的博客 198

C3 模块与普通 Bottleneck 堆叠区别

维度普通 Bottleneck 堆叠C3 模块设计理念残差学习CSP + 特征分治信息路径单一路径双路径(主干 + bypass)融合方式相加(Add)拼接(Concat)+ 卷积计算效率较低高(通道减半)特征保留弱(多次非线性)强(直连保留原始信息)梯度传播单一主路径多样化、更稳定任务适配通用(分类为主)专为目标检测优化可扩展性有限极强(即插即用各种模块)实际性能基准线显著优于(尤其在小目标和效率方面)

浩瀚之水的专栏 107

C++学习之STL入门简介

STL是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个保罗数据结构和算法的软件框架我们很明显地发现:s2是不能修改的因为它们的调用关系是这样的//遍历+修改//下标+[]s1[0]++;/*s2[0]++;return 0;迭代器的概念与分类迭代器是STL中访问容器元素的通用接口,行为类似指针,但抽象程度更高。迭代器类别正向迭代器(Forward Iterator):单向遍历(如双向迭代器。

2401_89119815的博客 1518

GD32F470移植LWIP协议,PHY芯片DP83848I

也就是说前24位是有规定的,其中48位MAC中的前几位也是有着对应的含义的。2、旧版LWIP(如1.4.1)存在DHCP状态机卡死问题,建议升级至2.1.3+。

m0_61973119的博客 1589

【C++】STL学习之旅——初识STL,认识string类

本文介绍了C++中的STL库,并初步讲解了string类

叫我龙翔的博客 2028

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C++ STL学习笔记

C++ STL 是一个非常强大且灵活的工具集,它为我们提供了许多高效的数据结构和算法。通过学习和使用 STL,我们可以大大提高代码的可读性和开发效率。在这篇学习笔记中,我详细介绍了 STL 的容器、迭代器、算法和函数对象。希望通过代码示例和详细解释,能够帮助你深入理解 STL 的核心概念,并能在实际开发中充分利用 STL 提供的功能。

软件开发工程师 696

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C++ STL学习——algorithm

在之前的博客中我们学习了很多STL中的模板库,包括deque,queue,stack,list等,他们都是一种数据结构,也就是说STL已经为我们实现了。今天我们来讲讲STL中比较大的一个库.  主要是一些算法的运算的实现,示例代码上传至  https://github.com/chenyufeng1991/STL_algorithm 。      在使用STL中的algorithm之前,需要导入头

乞力马扎罗的雪CYF的博客 4856

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【C++学习】C++ STL

C++ 学习

weixin_45769058的博客 934

C++ STL学习资源列表

 C++ STL(标准模板库) 学习资源列表 作者:Winter来源: 最优秀的STL学习网站 C++ STL(标准模板库) 学习资源列表1 STL网站类2 STL书籍类3 STL 技术文章类STL以其独特的魅力得到越来越多的程序员钟爱,STL彻底封装复杂的数据结构,提供丰富灵活的程序接口,同时还能保证程序的运行效率。上次整理的STL技术

87年的小强 682

c++《STL简介》 主要包括:《STL的重要性》《如何学习STL》《STL的缺陷》

一.什么是STL? STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包括数据结构与算法的软件框架 二。STL的版本 原始版本 Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件...

dpfxaca6的博客 935

怎样学习 C++ STL?

有C++基础的话: C++Primer 5th: Chapter 3: Strings, Vectors, and Arrays Chapter 9: Sequential Containers Chapter 10: Generic Algorithms Chapter 11: Associative Containers Chapter 16: Templates and

brandon2015的博客 615

C++的STL简介(·什么是STL·STL的版本·STL的六大组件·STL的重要性· 如何学习STL·STL的缺陷)

【本节目标】 ·1. 什么是STL ·2. STL的版本 ·3. STL的六大组件 ·4. STL的重要性 ·5. 如何学习STL ·6.STL的缺陷 1. 什么是STL STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。 2. STL的版本 ·原始版本 Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任.

weixin_56054625的博客 1059

C++奇迹之旅:STL初步学习

STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。

a_sen的博客 1320

用法 stl_C++ STL 学习系列一

废话:将要学习到 c++ template ,异常处理 ,并回顾数据库的部分知识 ,初步掌握 STL 开发 ,避免重复制造轮子。将学习到的知识点:模板编程泛型编程STL 常用组件lambda表达式异常处理内存处理部分数据结构部分算法提示:本课程所有代码至少需要开启 -std=c++11 选项来支持 C++11 相关特性,在介绍 C++14 特性时的相关代码需要开启 -std=c++14 的编译选项...

weixin_39846289的博客 90

C++学习STL,stringLEI

摘要:本文介绍了C++编程中的几个核心概念。1) STL是C++标准库的重要部分,包含六大组件:仿函数、算法、迭代器、空间配置器、容器和配接器。2) string类解决了C语言字符串操作不便的问题,使用时需包含相应头文件。3) auto关键字用于自动类型推导,声明引用时必须加&。4) C++11的范围for循环简化了集合遍历,底层实现基于迭代器,可自动完成取数据和结束判断。这些特性共同提升了C++编程的效率和安全性。

2402_87934098的博客 395

【C++】标准模板库(STL)—— 学习算法的利器

STL(Standard Template Library,标准模板库)是 C++ 标准库的重要组成部分,包含丰富的数据结构和算法,是现代 C++ 编程中必不可少的工具。本文将介绍 STL 的基本组成、学习重点以及学习 STL 前应具备的先修知识和学习路线,帮助你系统高效地掌握 STL。容器(Containers):用于存储和管理数据集合,例如vectorlistsetmap等。算法(Algorithms):提供排序、查找、遍历等通用操作函数。迭代器(Iterators)

Sagittarius_A*的博客 1270
上一篇: jsoncpp源码Linux环境编译
下一篇: 生产环境shell脚本监控
码农诗人
博客等级 码龄11年 986粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值