C++复习笔记--STL的基本概念和使用

2023-10-30

目录

1--STL基本概念

2--STL六大组件

2-1--容器的基本概念

2-2--算法的基本概念

2-3--迭代器的基本概念

3--代码实例

3-1--vector容器的使用

3-2--使用vector容器存储自定义类型

3-3--容器嵌套容器


1--STL基本概念

        STL:全称为 Standard Template Library,即标准模板库;

        STL 从广义上分为:容器(container)、算法(algorithm)和迭代器(iterator)

        在STL中,容器和算法之间通过迭代器进行关联,STL主要基于模板类和模板函数进行实现;

2--STL六大组件

        STL分为六大组件:容器、算法、迭代器、仿函数、适配器和空间配置器;

容器:包含各种数据结构,如 vector、list、deque、set、map 等,用于存放数据;

算法:包含各种常用的算法,如 sort、find、copy、for_each等;

迭代器:连接容器与算法;

仿函数:行为类似函数,可作为算法的某种策略;

适配器:用来修饰容器、仿函数或迭代器接口;

空间适配器:负责空间的配置与管理;

2-1--容器的基本概念

        容器用于存放数据,涵盖常用数据结构的实现,可分为序列式容器和关联式容器两种;

序列式容器:强调值的排序,每个元素都有固定的位置;

关联式容器:二叉树结构,各元素之间没有严格物理上的顺序关系;

2-2--算法的基本概念

        利用有限的步骤解决逻辑上的问题,其可细分为质变算法和非质变算法;

质变算法:在运算过程中会更改区间内元素的内容,例如拷贝、替换和删除等;

非质变算法:在运算过程中不会更改区间内元素的内容,例如查找、计数、遍历等;

2-3--迭代器的基本概念

        提供方法用于寻访容器的元素,但无需暴露容器的内部表示方式;

        每个容器拥有其专属的迭代器;

迭代器的种类:

        ① 输入迭代器:对数据只读;

        ② 输出迭代器:对数据只写;

        ③ 前向迭代器:读写操作,能向前推进迭代器;

        ④ 双向迭代器:读写操作,能向前和向后实施操作;

        ⑤ 随机访问迭代器:读写操作,能以跳跃的方式访问任意数据,功能最强;

3--代码实例

3-1--vector容器的使用

# include <iostream>
# include <vector>
# include <algorithm> // 标准算法的头文件

void myPrint(int val){
    std::cout << val << std::endl;
}

int main(){
    // 创建一个 vector 容器
    std::vector<int> v;
    v.push_back(10);
    v.push_back(20);
    v.push_back(30);
    v.push_back(40);

    // 第一种遍历方式
    // 通过迭代器访问容器中的数据
    std::vector<int>::iterator itBegin = v.begin(); // 起始迭代器 指向容器中第一个元素
    std::vector<int>::iterator itEnd = v.end(); // 结束迭代器 指向容器中最后一个元素的下一个位置
    while(itBegin != itEnd){
        std::cout << *itBegin << std::endl;
        itBegin++;
    }

    // 第二种遍历方式
    for(std::vector<int>::iterator it = v.begin();  it != v.end(); it++){
        std::cout << *it << std::endl;
    }

    // 第三种遍历方式,利用 STL 提供的遍历算法
    for_each(v.begin(), v.end(), myPrint);

    return 0;
}

3-2--使用vector容器存储自定义类型

# include <iostream>
# include <vector>
# include <string>
# include <algorithm> // 标准算法的头文件

class Person{
public:
    Person(std::string name, int age){
        this->Name = name;
        this->Age = age;
    }
    std::string Name;
    int Age;
};


void test1(){
    std::vector<Person>v;
    Person p1("Zhangsan", 18);
    Person p2("Lisi", 19);
    Person p3("Wangwu", 20);
    Person p4("Zhaoliu", 21);

    v.push_back(p1);
    v.push_back(p2);
    v.push_back(p3);
    v.push_back(p4);

    // 遍历容器中的数据
    for(std::vector<Person>::iterator it = v.begin(); it != v.end(); it++){
        std::cout << "Name: " << it->Name << " Age: " << it->Age << std::endl;
    }
}

void test2(){
    std::vector<Person*>v;
    Person p1("Zhangsan", 18);
    Person p2("Lisi", 19);
    Person p3("Wangwu", 20);
    Person p4("Zhaoliu", 21);
    
    v.push_back(&p1);
    v.push_back(&p2);
    v.push_back(&p3);
    v.push_back(&p4);

    // 遍历容器中的数据
    for(std::vector<Person*>::iterator it = v.begin(); it != v.end(); it++){
        std::cout << "Name: " << (*it)->Name << " Age: " << (*it)->Age << std::endl;
    }
}
int main(){

    test2();
    return 0;
}

3-3--容器嵌套容器

# include <iostream>
# include <vector>
# include <string>
# include <algorithm> // 标准算法的头文件

// 容器嵌套容器
void test1(){
    std::vector<std::vector<int>>v;

    //创建小容器
    std::vector<int>v1;
    std::vector<int>v2;
    std::vector<int>v3;
    std::vector<int>v4;
    //向小容器添加数据
    for(int i = 0; i < 4; i++){
        v1.push_back(i+10);
        v2.push_back(i+20);
        v3.push_back(i+30);
        v4.push_back(i+40);
    }
    //将小容器放置在大容器中
    v.push_back(v1);
    v.push_back(v2);
    v.push_back(v3);
    v.push_back(v4);

    for(std::vector<std::vector<int>>::iterator it = v.begin(); it != v.end(); it++){
        for(std::vector<int>::iterator vit = (*it).begin(); vit != (*it).end(); vit++){
            std::cout << *vit << " ";
        }
        std::cout << std::endl;
    }
}

int main(){
    test1();
    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++复习笔记--STL的基本概念和使用 的相关文章

  • 检查两个数是否是彼此的排列?

    给定两个数字 a b 使得 1 例如 123 是 312 的有效排列 我也不想对数字中的数字进行排序 如果您指的是数字的字符 例如 1927 和 9721 则 至少 有几种方法 如果允许排序 一种方法是简单地sprintf将它们放入两个缓冲
  • 如何使 Windows 窗体的关闭按钮不关闭窗体但使其不可见?

    该表单有一个 NotifyIcon 对象 当用户单击 关闭 按钮时 我希望表单不关闭而是变得不可见 然后 如果用户想再次查看该表单 可以双击系统托盘中的图标 如果用户想关闭表单 可以右键单击该图标并选择 关闭 有人可以告诉我如何使关闭按钮不
  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • 当我使用“control-c”关闭发送对等方的套接字时,为什么接收对等方的套接字不断接收“”

    我是套接字编程的新手 我知道使用 control c 关闭套接字是一个坏习惯 但是为什么在我使用 control c 关闭发送进程后 接收方上的套接字不断接收 在 control c 退出进程后 发送方的套接字不应该关闭吗 谢谢 我知道使用
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • 如何忽略“有符号和无符号整数表达式之间的比较”?

    谁能告诉我必须使用哪个标志才能使 gcc 忽略 有符号和无符号整数表达式之间的比较 警告消息 gcc Wno sign compare 但你确实应该修复它警告你的比较
  • 将布尔参数传递给 SQL Server 存储过程

    我早些时候问过这个问题 我以为我找到了问题所在 但我没有 我在将布尔参数传递给存储过程时遇到问题 这是我的 C 代码 public bool upload false protected void showDate object sende
  • Json.NET - 反序列化接口属性引发错误“类型是接口或抽象类,无法实例化”

    我有一个类 其属性是接口 public class Foo public int Number get set public ISomething Thing get set 尝试反序列化Foo使用 Json NET 的类给我一条错误消息
  • Web API - 访问 DbContext 类中的 HttpContext

    在我的 C Web API 应用程序中 我添加了CreatedDate and CreatedBy所有表中的列 现在 每当在任何表中添加新记录时 我想填充这些列 为此目的我已经覆盖SaveChanges and SaveChangesAsy
  • 指针减法混乱

    当我们从另一个指针中减去一个指针时 差值不等于它们相距多少字节 而是等于它们相距多少个整数 如果指向整数 为什么这样 这个想法是你指向内存块 06 07 08 09 10 11 mem 18 24 17 53 7 14 data 如果你有i
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • 将 xml 反序列化为类,list<> 出现问题

    我有以下 XML
  • 如何让Gtk+窗口背景透明?

    我想让 Gtk 窗口的背景透明 以便只有窗口中的小部件可见 我找到了一些教程 http mikehearn wordpress com 2006 03 26 gtk windows with alpha channels https web
  • WCF:将随机数添加到 UsernameToken

    我正在尝试连接到用 Java 编写的 Web 服务 但有些东西我无法弄清楚 使用 WCF 和 customBinding 几乎一切似乎都很好 除了 SOAP 消息的一部分 因为它缺少 Nonce 和 Created 部分节点 显然我错过了一
  • Process.Start 阻塞

    我正在调用 Process Start 但它会阻止当前线程 pInfo new ProcessStartInfo C Windows notepad exe Start process mProcess new Process mProce
  • const、span 和迭代器的问题

    我尝试编写一个按索引迭代容器的迭代器 AIt and a const It两者都允许更改容器的内容 AConst it and a const Const it两者都禁止更改容器的内容 之后 我尝试写一个span
  • mysql-connector-c++ - “get_driver_instance”不是“sql::mysql”的成员

    我是 C 的初学者 我认为学习的唯一方法就是接触一些代码 我正在尝试构建一个连接到 mysql 数据库的程序 我在 Linux 上使用 g 没有想法 我运行 make 这是我的错误 hello cpp 38 error get driver
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我

随机推荐