vector和string类库中的迭代器

devtools/2025/1/19 17:58:18/

关于标准库类型vector:定义和初始化vector对象的方式有哪些

  1. 默认初始化:创建一个空的 vector 

    std::vector<int> v1;
    
  2. 初始化指定数量的相同默认值元素:

    std::vector<int> v2(5);  // 包含 5 个默认值为 0 的整数
    
  3. 初始化指定数量的指定值元素:

    std::vector<int> v3(5, 10);  // 包含 5 个值为 10 的整数
    
  4. 用列表初始化:

    std::vector<int> v4{1, 2, 3, 4, 5};
    
  5. 复制初始化:

    std::vector<int> v5 = {6, 7, 8, 9, 10};
    
  6. 从另一个 vector 初始化:

    std::vector<int> v6(v4);  // 复制 v4 初始化 v6
    
  7. 使用迭代器范围初始化:

    int arr[] = {11, 12, 13};
    std::vector<int> v7(std::begin(arr), std::end(arr));
    

向vector对象中添加元素的方式有哪些

  1. 使用 push_back 函数:这是最常见的方式,在 vector 的末尾添加一个元素。

    std::vector<int> vec;
    vec.push_back(10); 
    
  2. 使用 insert 函数:可以在指定位置插入一个或多个元素。

    std::vector<int> vec2 = {1, 2, 3};
    vec2.insert(vec2.begin() + 1, 5);  // 在索引为 1 的位置插入 5
    
     

    也可以插入多个相同元素:

    vec2.insert(vec2.begin() + 1, 3, 7);  // 在索引为 1 的位置插入 3 个 7
    
     

    或者插入一段范围内的元素:

    std::vector<int> other = {8, 9, 10};
    vec2.insert(vec2.begin() + 1, other.begin(), other.end());  // 插入另一个 `vector` 的一段元素

 

关于迭代器在string和vector类库中的语法介绍、使用、运算

迭代器在 string 和 vector 中的语法

对于 vector :
std::vector<int> vec = {10, 20, 30, 40, 50};
// 声明普通迭代器
std::vector<int>::iterator vecIt;
// 声明常量迭代器,不能通过它修改元素值
std::vector<int>::const_iterator vecConstIt;// 对于反向迭代器
std::vector<int>::reverse_iterator vecRevIt;
// 常量反向迭代器
std::vector<int>::const_reverse_iterator vecConstRevIt;
对于 string :
​
std::string str = "hello world";
// 普通迭代器
std::string::iterator strIt;
// 常量迭代器
std::string::const_iterator strConstIt;// 反向迭代器
std::string::reverse_iterator strRevIt;
// 常量反向迭代器
std::string::const_reverse_iterator strConstRevIt;​

迭代器的使用

以 vector 为例:
​
for (vecIt = vec.begin(); vecIt!= vec.end(); ++vecIt) {std::cout << *vecIt << " ";  // 输出当前元素
}
std::cout << std::endl;// 使用反向迭代器从后往前遍历
for (vecRevIt = vec.rbegin(); vecRevIt!= vec.rend(); ++vecRevIt) {std::cout << *vecRevIt << " ";
}
std::cout << std::endl;​
对于 string :
​
for (strIt = str.begin(); strIt!= str.end(); ++strIt) {std::cout << *strIt;  // 输出当前字符
}
std::cout << std::endl;// 使用反向迭代器
for (strRevIt = str.rbegin(); strRevIt!= str.rend(); ++strRevIt) {std::cout << *strRevIt;
}
std::cout << std::endl;​

迭代器的运算

  1. 递增和递减:
    • 普通迭代器和反向迭代器都支持 ++ (向前或向后移动一个位置)和 -- (向前或向后移动一个位置)操作。
    • 对于普通迭代器 ++ 使其指向容器中的下一个元素,-- 使其指向上一个元素。
    • 对于反向迭代器,++ 使其指向前一个元素,-- 使其指向后一个元素。
  2. 解引用:
    • 通过 * 操作符可以获取迭代器当前指向的元素的值。
    • 例如,对于 vector<int>::iterator it; ,*it 就是当前指向的整数。
  3. 比较:
    • 可以使用 == 、 != 、 < 、 <= 、 > 、 >= 等比较操作符来比较两个迭代器。
    • 通常用于判断迭代器是否到达容器的开头、结尾,或者确定两个迭代器的相对位置。

在使用迭代器时,一定要小心处理边界情况,避免出现越界访问等错误。

string和vector类库中的成员函数begin()和end()

在 vector 和 string 中,begin() 和 end() 是非常重要的成员函数。

begin() 函数:

  • 返回一个迭代器,指向容器的第一个元素。
  • 对于 vector ,如果容器为空,返回的迭代器和 end() 返回的迭代器相同,都表示 “超出末端的位置”。
  • 对于 string ,即使字符串为空,begin() 也会返回一个有效的迭代器,但解引用此迭代器是未定义行为。

end() 函数:

  • 返回一个迭代器,指向容器 “最后一个元素的下一个位置”,这个位置被视为超出容器末端的位置。
  • 不能对这个迭代器进行解引用操作,它主要用于在循环中判断是否已经遍历完整个容器。

以 vector<int> vec = {1, 2, 3}; 为例:

  • vec.begin() 会返回一个指向 1 的迭代器。
  • vec.end() 会返回一个指向 3 后面的位置的迭代器。

对于 string str = "hello"; :

  • str.begin() 会返回一个指向 h 的迭代器。
  • str.end() 会返回一个指向字符串结束位置(即 '\0' 字符的位置)之后的迭代器。

在使用 begin() 和 end() 配合迭代器进行循环时,通常的循环条件是 it!= vec.end() 或者 it!= str.end() ,以确保在到达容器末尾时停止循环操作。


http://www.ppmy.cn/devtools/151875.html

相关文章

mybatisPlus打印sql配置

MyBatis-Plus 提供了方便的配置方式来打印 SQL 查询语句&#xff0c;以便进行调试和性能分析。可以通过配置 log 来输出 SQL 语句以及执行的参数。 方法 1&#xff1a;通过 application.properties 或 application.yml 配置打印 SQL 可以通过配置 application.properties 或 a…

基于 Python 的毕设选题管理系统设计与实现

标题:基于 Python 的毕设选题管理系统设计与实现 内容:1.摘要 本文介绍了一个基于 Python 的毕设选题管理系统的设计与实现。该系统旨在解决传统毕设选题管理方式中存在的效率低下、信息不透明等问题。通过使用 Python 语言和相关技术&#xff0c;实现了对毕设选题的信息化管理…

汇编语言:基于x86处理器考前笔记 | 第九章 字符串和数组

汇编语言第九章笔记 一、字符串基本指令 指令类型 数据移动指令&#xff1a;MOVSB、MOVSW和MOVSD&#xff0c;用于将由<u>ESI</u>寻址的内存地址处的数据复制到<u>EDI</u>寻址的内存地址处。例如在代码中&#xff0c;<u>rep</u> movsd可…

事务处理系统 (Transaction Processing System, TPS)

事务处理系统 (Transaction Processing System, TPS) 是一种专门用于自动化日常业务事务处理的计算机系统。这类系统通常处理大量的结构化数据,如订单处理、支付结算、库存管理等,以支持企业日常的运营和管理。TPS 的核心任务是确保高效、准确地记录和管理大量重复性的事务,…

ComfyUI-PromptOptimizer:文生图提示优化节点

ComfyUI-PromptOptimizer 是 ComfyUI 的一个自定义节点&#xff0c;旨在优化文本转图像模型的提示。它将用户输入的提示转换为更详细、更多样化、更生动的描述&#xff0c;使其更适合生成高质量的图像。无需本地模型。 1、功能 提示优化&#xff1a;优化用户输入的提示以生成…

Kubernetes (K8s) 权限管理指南

1. 引言 Kubernetes (K8s) 作为当今最流行的容器编排平台,其安全性至关重要。本指南旨在全面介绍 K8s 的权限管理机制,帮助具有一定基础的读者深入理解并掌握这一关键领域。 © ivwdcwso (ID: u012172506) 2. Kubernetes 安全模型概述 K8s 的安全模型主要包括三个阶段…

20250118-读取并显示彩色图像以及提取彩色图像的 R、G、B 分量

读取并显示彩色图像以及提取彩色图像的 R、G、B 分量 import cv2 #彩图R、G、B的提取 import torch from PIL import Image from matplotlib import pyplot as plt import numpy as np读取并显示彩色图像的三种方法&#xff1a; img_path "./data/yndx"1.1 使用 …

原型与原型链

建议大家看的时候手动画图&#xff01;&#xff01;&#xff01;这点很重要&#xff01;&#xff01;&#xff01; 原型链在结构上很像链表&#xff0c;每个对象中都保存着一个地址&#xff0c;指向当前对象的原型&#xff0c;可以层层向上查找&#xff0c;起到继承的效果。 …