C/C++ - 容器vector

news2024/9/24 9:20:08

目录

容器特性

构造函数

默认构造函数

填充构造函数

范围构造函数

拷贝构造函数

内存布局

大小函数

size() 函数

capacity() 函数

empty() 函数

resize() 函数

增加函数

push_back(const T& value)

emplace_back(Args&&... args)

push_back和emplace_back

iterator

insert(iterator position, const T& value)

insert(iterator position, size_type n, const T& val)

insert( position, InputIterator first, InputIterator last)

删除函数

pop_back()

erase(iterator position)

erase(iterator first, iterator last)

clear()

修改函数

使用下标操作符[]

使用at()​​成员函数

使用迭代器

使用front()​​和back()​​成员函数

查找函数

std::find

std::find_if


容器特性

  • C++ 中的 vector 容器是一个动态数组,它提供了一种能够在运行时调整大小的数组结构。它属于标准模板库(STL)的一部分,定义在 <vector>​​​​​ 头文件中。
  • vector容器特性

    • 动态大小: vector 容器可以在运行时动态调整大小,可以根据需要自动增长或缩小。这使得在不知道需要存储多少元素的情况下使用 vector 变得更加灵活。
    • 连续存储: vector 容器的元素在内存中是连续存储的,这使得元素的访问更加高效。
    • 动态添加和删除: vector 容器提供了在任意位置插入和删除元素的方法。这使得在向量的任意位置进行插入、删除和修改操作变得容易。
    • 随机访问: 可以通过索引直接访问 vector 容器中的元素,这使得在需要快速访问元素的场景中非常有用。
    • 自动内存管理: vector 容器自动管理内存分配和释放,无需手动处理内存分配和释放的细节。当向量的大小超过当前分配的内存时,它会自动重新分配更大的内存来容纳更多的元素。

构造函数

  • 默认构造函数

    • 函数:默认构造函数

    • 用途:创建一个空的 std::vector​​ 容器。

    • 语法:std::vector<T> vec;​​

    • 返回值:无

      
      #include <vector>
      #include <iostream>
      
      int main() {
          std::vector<int> vec;
          std::cout << "Vector size: " << vec.size() << std::endl;
          return 0;
      }
      
  • 填充构造函数

    • 函数:填充构造函数

    • 用途:创建一个具有特定大小的 std::vector​​,每个元素都初始化为传入的值。

    • 语法:std::vector<T> vec(n, value);​​

    • 返回值:无

      
      #include <vector>
      #include <iostream>
      
      int main() {
          std::vector<int> vec(5, 10); // 创建一个大小为5的vector,每个元素都是10
      
          for(int i : vec) {
              std::cout << i << ' ';
          }
          return 0;
      }
      
  • 范围构造函数

    • 函数:范围构造函数

    • 用途:根据另一个容器或数组的范围创建一个 std::vector​​。

    • 语法:std::vector<T> vec(first, last);​​

    • 返回值:无

      
      #include <vector>
      #include <iostream>
      
      int main() {
          int array[] = {1, 2, 3, 4, 5};
          std::vector<int> vec(array, array + 5); // 从数组创建vector
      
          for(int i : vec) {
              std::cout << i << ' ';
          }
          return 0;
      }
      
  • 拷贝构造函数

    • 函数:拷贝构造函数

    • 用途:创建一个新的 std::vector​​,作为另一个 std::vector​​ 的副本。

    • 语法:std::vector<T> vec(otherVector);​​

    • 返回值:无

      
      #include <vector>
      #include <iostream>
      
      int main() {
          std::vector<int> originalVec = {1, 2, 3, 4, 5};
          std::vector<int> vec(originalVec); // 使用originalVec创建vec
      
          for(int i : vec) {
              std::cout << i << ' ';
          }
          return 0;
      }
      
  • 移动构造函数 (C++11 及以后)

    • 函数:移动构造函数

    • 用途:通过移动另一个 std::vector​​ 的资源(而不是拷贝)来创建一个新的 std::vector​​。

    • 语法:std::vector<T> vec(std::move(otherVector));​​

    • 返回值:无

      
      #include <vector>
      #include <iostream>
      
      int main() {
          std::vector<int> originalVec = {1, 2, 3, 4, 5};
          std::vector<int> vec(std::move(originalVec)); // 移动构造
      
      
          std::cout << "originalVec size: " << originalVec.size() << std::endl;
          std::cout << "vec size: " << vec.size() << std::endl;
          for(int i : vec) {
              std::cout << i << ' ';
          }
          return 0;
      }
      
  • 内存布局

    • 开始指针(start): 指向数组的起始位置。
    • 结束指针(end): 指向数组最后一个元素之后的位置,用于迭代和确定大小。
    • 容量末尾指针(end of storage): 指向分配的内存块末尾之后的位置,用于确定是否需要重新分配。

大小函数

  • 大小函数

    • size() 函数

      • 用途:size()​​​​​函数用来返回vector​​​​​中当前存储的元素数量。
      • 语法:size_type size() const;​​​​​
      • 返回值:返回vector​​​​​当前包含的元素个数,类型为size_type​​​​​,这通常是一个无符号整型值。
    • capacity() 函数

      • 用途:虽然capacity()​​​​​并非直接用于获取vector​​​​​的“大小”,它用来返回vector​​​​​在重新分配内存之前能够存储的元素数量。这是vector​​​​​预分配的内存大小。
      • 语法:size_type capacity() const noexcept;​​​​​
      • 返回值:返回vector​​​​​在不进行内存重新分配的情况下能存储的最大元素数量。
    • empty() 函数

      • 用途:empty()​​​​​函数用来检查vector​​​​​是否为空,即是否不包含任何元素。
      • 语法:bool empty() const noexcept;​​​​​
      • 返回值:如果vector​​​​​为空则返回true​​​​​,否则返回false​​​​​。
    • resize() 函数

      • 用途:resize()​​​​​函数用来改变vector​​​​​的大小,即改变其包含的元素数量。如果新大小大于当前大小,会在vector​​​​​的末尾添加默认初始化的元素。如果新大小小于当前大小,则末尾的元素会被丢弃。
      • 语法:void resize(size_type n);​​​​​
      • 参数:n​​​​​是新的大小。

增加函数

  • push_back(const T& value)

    • 用途:将一个新元素添加到vector​​​​的末尾。
    • 语法:void push_back(const T& value);​​​​
    • 返回值:无。
  • emplace_back(Args&&... args)

    • 用途:在vector​​​​的末尾构造一个新元素,可以避免额外的复制或移动操作。
    • 语法:void emplace_back(Args&&... args);​​​​
    • 返回值:无
    • #include <iostream>
      #include <vector>
      
      class Person
      {
      public:
      	Person(const char* name, int nAge)
      	{
      		m_Name = name;
      		m_Age = nAge;
      	}
      	const char* m_Name;
      	int m_Age;
      };
      
      int main()
      {
      	std::vector<Person> vec;
      
      	Person p1("Tom", 18);
      	vec.push_back(p1);
      	//Error -> obj
      	//vec.push_back("Tom", 1);
      	vec.emplace_back("0xCC", 18);
      
      	return 0;
      }
      
  • push_back和emplace_back

    • ​push_back​​​函数将元素添加到容器的末尾。当使用push_back​​​时,它会将传入的元素作为参数,首先在容器外部构造这个元素,然后将该元素复制(或移动,如果支持移动语义)到容器中。这意味着如果元素类型是类类型,这个过程可能涉及到调用拷贝构造函数或移动构造函数。
    • ​emplace_back​​​函数也是向容器末尾添加元素,但它的工作方式略有不同。emplace_back​​​会直接在容器的末尾就地构造元素,避免了额外的拷贝或移动操作。这是通过接受构造函数参数而不是元素本身,然后使用这些参数直接在容器的存储空间中构造元素来实现的。这意味着emplace_back​​​可以提供更好的性能,特别是对于复杂对象。
  • iterator

    • #include <iostream>
      #include <vector>
      
      int main()
      {
      	std::vector<int> vec = { 1,2,3,4,5 };
      
      	for (auto i = vec.begin(); i != vec.end(); i++)
      	{
      		std::cout << *i << std::endl;
      	}
      	return 0;
      }
      
  • insert(iterator position, const T& value)

    • 用途:在vector​​​​的指定位置之前插入一个新元素。
    • 语法:iterator insert(iterator position, const T& value);​​​​
    • 返回值:指向新插入元素的迭代器。
  • insert(iterator position, size_type n, const T& val)

    • 用途:在指定位置插入n​​​​个val​​​​元素。
    • 语法:void insert(iterator position, size_type n, const T& val);​​​​
    • 返回值:无。
  • insert( position, InputIterator first, InputIterator last)

    • 用途:在指定位置插入另一个容器[first, last)​​​​区间的所有元素。
    • 语法:void insert(iterator position, InputIterator first, InputIterator last);​​​​
    • 返回值:无。
    • #include <iostream>
      #include <vector>
      
      int main()
      {
      	std::vector<int> vec = { 1,2,3,4,5 };
      	std::vector<int> vec1 = { 11,22,33,44,55 };
      
      	//头部插入元素
      	vec.insert(vec.begin(), 0);
      
      	//尾部插入元素
      	vec.insert(vec.end(), 5, 0xCC);
      
      	//指定插入元素
      	vec.insert(vec.begin() + 2, 3);
      
      	//插入指定容器
      	vec.insert(vec.begin(), vec1.begin(), vec1.end());
      
      	return 0;
      }
      

删除函数

  • pop_back()

    • 用途:删除vector​​​末尾的元素。
    • 语法:void pop_back();​​​
    • 返回值:无。
    • #include <iostream>
      #include <vector>
      
      int main()
      {
      	std::vector<int> vec = { 1,2,3,4,5 };
      	vec.pop_back();
      
      	return 0;
      }
      
  • erase(iterator position)

    • 用途:删除vector​​​中指定位置的元素。
    • 语法:iterator erase(iterator position);​​​
    • 返回值:指向被删除元素之后元素的迭代器。
    • #include <iostream>
      #include <vector>
      
      int main()
      {
      	std::vector<int> vec = { 1,2,3,4,5 };
      	vec.erase(vec.begin() + 1);
      
      	return 0;
      }
      
  • erase(iterator first, iterator last)

    • 用途:删除vector​​​中从first​​​到last​​​(不包括last​​​)区间内的所有元素。
    • 语法:iterator erase(iterator first, iterator last);​​​
    • 返回值:指向last​​​元素之前被删除的第一个元素之后元素的迭代器。
    • #include <iostream>
      #include <vector>
      
      int main()
      {
      	std::vector<int> vec = { 1,2,3,4,5 };
      	vec.erase(vec.begin() + 1, vec.end());
      
      	return 0;
      }
      
  • clear()

    • 用途:删除vector​​​中的所有元素,但不改变其容量。
    • 语法:void clear();​​​
    • 返回值:无。
    • #include <iostream>
      #include <vector>
      
      int main()
      {
      	std::vector<int> vec = { 1,2,3,4,5 };
      	vec.clear();
      
      	return 0;
      }
      

修改函数

  • 使用下标操作符[]

    • 用法:通过元素的索引来访问并修改vector​​​中的元素。
    • 语法:vector[index] = newValue;​​​
    • 返回值:无。
    • #include <iostream>
      #include <vector>
      
      int main()
      {
      	std::vector<int> vec = { 1,2,3,4,5 };
      
      	vec[1] = 22;
      
      	for (auto i : vec)
      	{
      		std::cout << i << std::endl;
      	}
      
      	return 0;
      }
      
  • 使用at()​​成员函数

    • 用法:通过元素的索引来访问并修改vector​​​中的元素,同时进行边界检查。
    • 语法:vector.at(index) = newValue;​​​
    • 返回值:引用到指定元素的引用。
    • #include <iostream>
      #include <vector>
      
      int main()
      {
      	std::vector<int> vec = { 1,2,3,4,5 };
      
      	vec.at(2) = 222;
      
      	for (auto i : vec)
      	{
      		std::cout << i << std::endl;
      	}
      
      	return 0;
      }
      
  • 使用迭代器

    • 用法:通过迭代器来访问并修改vector​​​中的元素。
    • 语法:*iterator = newValue;​​​
    • 返回值:无。
    • #include <iostream>
      #include <vector>
      
      int main()
      {
      	std::vector<int> vec = { 1,2,3,4,5 };
      
      	auto iter = vec.begin() + 3;
      	*iter = 333;
      
      	for (auto i : vec)
      	{
      		std::cout << i << std::endl;
      	}
      
      	return 0;
      }
      
  • 使用front()​​和back()​​成员函数

    • 用法:修改vector​​​中的第一个元素或最后一个元素的值。

    • 语法:

      • ​vector.front() = newValue;​​​ 修改第一个元素的值。
      • ​vector.back() = newValue;​​​ 修改最后一个元素的值。
    • 返回值:分别是第一个元素和最后一个元素的引用。

    • #include <iostream>
      #include <vector>
      
      int main()
      {
      	std::vector<int> vec = { 1,2,3,4,5 };
      
      	vec.front() = 111;
      	vec.back() = 555;
      
      	for (auto i : vec)
      	{
      		std::cout << i << std::endl;
      	}
      
      	return 0;
      }
      

查找函数

  • std::find

    • 用途:用于在给定的范围内查找一个特定的值。

    • 语法:std::find(Iterator first, Iterator last, const T& value);​​

      • ​first​​和last​​是定义查找范围的迭代器。
      • ​value​​是要查找的值。
    • 返回值:如果找到,则返回一个指向首次出现该值的迭代器;如果未找到,则返回last​​(结束迭代器)。

    • #include <iostream>
      #include <vector>
      
      int main()
      {
      	std::vector<int> vec = { 2,4,5,6,8 };
      
      	auto iter = std::find(vec.begin(), vec.end(), 6);
      	if (iter != vec.end())
      	{
      		std::cout << *iter << std::endl;
      	}
      
      	return 0;
      }
      

  • std::find_if

    • 用途:根据一个谓词查找范围内的第一个满足条件的元素。

    • 语法:std::find_if(Iterator first, Iterator last, UnaryPredicate pred);​​

      • ​first​​和last​​是定义查找范围的迭代器。

      • ​pred​​是一个一元谓词,用于测试每个元素是否满足条件。

        • 在C++中,谓词(Predicate)是指一个函数或者函数对象(包括lambda表达式),它接收一定的输入并返回一个布尔值。这个布尔值通常用于表示某个条件是否满足。
        • 一元谓词是一种只接受一个参数的函数或函数对象。
        • 二元谓词则接受两个参数。它通常用于比较这两个参数之间的关系,比如在排序算法中定义排序准则。
    • 返回值:如果找到,则返回一个指向首次满足条件的元素的迭代器;如果未找到,则返回last​​。

    • #include <iostream>
      #include <vector>
      
      bool isNum(int x)
      {
      	return x % 2 != 0;
      }
      
      int main()
      {
      	std::vector<int> vec = { 2,4,5,6,8 };
      
      	auto iter = std::find_if(vec.begin(), vec.end(), isNum);
      	if (iter != vec.end())
      	{
      		std::cout << *iter << std::endl;
      	}
      
      	return 0;
      }
      

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1440290.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux(redhat)重置root密码

首先将root密码改成几乎不可能记住的密码 [rootexample ~]# echo fheowafuflaeijifehowf|passwd --stdin root Changing password for user root. passwd: all authentication tokens updated successfully.重启系统&#xff0c;进入救援模式 出现此页面&#xff0c;按e键 lin…

一个简单的2024龙年倒计时页面html源码

预览如下 复制粘贴下面的代码&#xff0c;另存为html文件即可打开&#xff0c;文字链接都可以更改&#xff1a; <!doctype html> <html> <head> <meta charset"utf-8"> <title>2024新年倒计时</title> <style>::-webki…

Linux操作系统基础(二):Linux操作系统概述

文章目录 Linux操作系统概述 一、Linux起源 二、Linux 的含义 三、Linux发行版 Linux操作系统概述 一、Linux起源 Linux创始人——林纳斯 托瓦兹 Linux 诞生于1991年&#xff0c;作者上大学期间实现的 Linux的特点&#xff1a;开源、免费、拥有最为庞大的源码贡献者 …

Mac安装Homebrew+MySQL+Redis+Nginx+Tomcat等

Mac安装HomebrewMySQLRedisNginxTomcat等 文章目录 Mac安装HomebrewMySQLRedisNginxTomcat等一、Mac安装Mysql 8①&#xff1a;下载②&#xff1a;安装③&#xff1a;配置环境变量④&#xff1a;外部连接测试 二、Mac安装Redis和可视化工具①&#xff1a;安装Redis01&#xff1…

STL常用容器—set容器

STL常用容器—set容器 1. set容器相关概念2. 初始化容器3. set容器插入和删除4. set容器大小和交换5. set容器的查找和统计6. set、multiset、unordered_set三者的区别7. pair对组的创建8. set容器的排序 参考博文&#xff1a;STL常用容器——set容器的使用 1. set容器相关概念…

SpringSecurity+OAuth2权限管理实战

Spring Security快速入门 官方文档&#xff1a; Spring Security :: Spring Security 功能&#xff1a; 身份认证&#xff08;authentication&#xff09; 授权&#xff08;authorization&#xff09; 防御常见攻击&#xff08;protection against common attacks&#xff…

Filter 实现过滤符合条件的请求并落库

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、配置过滤器类 二、定义数据表、实体类、Mapper 2.1 DDL 2.2 实体类 2.3 Mapper 三、创建一个过滤器 四、实现 Nacos 配置…

C语言第二十一弹---指针(五)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 转移表 1、转移表 总结 1、转移表 函数指针数组的用途&#xff1a;转移表 举例&#xff1a;计算器的⼀般实现&#xff1a; 假设我们需要做一个能够进行加减…

JavaScript 弹窗(Popup Windows)

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 在互联网时代&#xff0c;弹窗是一种常见的交互方式。它可以用于显示…

C语言笔试题之二进制求和

实例要求&#xff1a; 给定2个二进制字符串 a 和 b &#xff0c;以二进制字符串的形式返回它们的和&#xff1b; 案例展示&#xff1a; 实例分析&#xff1a; 1、利用strlen函数分别求出二进制字符串 a 和 b的长度&#xff1b;2、结果字符串长度为较长输入字符串加1&#xf…

数据结构入门(1)数据结构介绍

目录 前言 1. 什么是数据结构&#xff1f; 2.什么是算法&#xff1f; 3.数据结构和算法的重要性 前言 本文将开始介绍计算机里的数据结构。 数据结构是指数据对象中元素之间的关系&#xff0c;以及对这些关系的操作。数据结构可以分为线性结构和非线性结构。 线性结构是…

力扣面试题 05.06. 整数转换(位运算)

Problem: 面试题 05.06. 整数转换 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.通过将两个数进行异或操作求出两个数中不同的位(不同的位异或后为二进制1); 2.统计异或后不同的位的个数(即异或后二进制为1的个数) 复杂度 时间复杂度: O ( 1 ) O(1) O(1) 空间…

C++:STL - vector

C&#xff1a;STL - vector 构造函数修改操作push_backpop_backerase 访问操作emptyoperatror[]backfront 容量操作sizecapacityresizereserve C的vector是一种可变长度的动态数组&#xff0c;被广泛用于C编程中。它是标准模板库&#xff08;STL&#xff09;中的容器之一&#…

2024年 复习 HTML5+CSS3+移动web 笔记 之CSS遍 第6天

6.1 定位-相对和绝对和固定 6.2 相对和绝对和固定 6.3 堆叠顺序z-index 6.4 定位总结 6.5 CSS精灵 基本使用 6.6 案例 CSS精灵 京东服务 6.7 字体图标-下载和使用 6.8 字体图标-上传 6.9 垂直对齐方式vertical-align 6.10 过渡属性 6.11 修饰属性-透明度与光标类型 6.12 综合案…

react将选中文本自动滑动到容器可视区域内

// 自动滚动到可视区域内useEffect(() > {const target ref;const wrapper wrapperRef?.current;if (target && wrapperRef) {const rect target.getBoundingClientRect();const wrapperRect wrapper.getBoundingClientRect();const isVisible rect.bottom &l…

npm 上传一个自己的应用(4) 更新自己上传到NPM中的工具版本 并进行内容修改

前面 npm 上传一个自己的应用(2) 创建一个JavaScript函数 并发布到NPM 我们讲了将自己写的一个函数发送到npm上 那么 如果我们想到更好的方案 希望对这个方法进行修改呢&#xff1f; 比如 我们这里加一个方法 首先 我们还是要登录npm npm login然后 根据要求填写 Username 用…

Sping Cloud Hystrix 参数配置、简单使用、DashBoard

Sping Cloud Hystrix 文章目录 Sping Cloud Hystrix一、Hystrix 服务降级二、Hystrix使用示例三、OpenFeign Hystrix四、Hystrix参数HystrixCommand.Setter核心参数Command PropertiesFallback降级配置Circuit Breaker 熔断器配置Metrix 健康统计配置Request Context 相关参数C…

【Spring源码解读!底层原理进阶】【上】探寻Spring内部:BeanFactory和ApplicationContext实现原理揭秘✨

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《Spring 狂野之旅&#xff1a;底层原理高级进阶》 &#x1f680…

【图形图像的C++ 实现 01/20】 2D 和 3D 贝塞尔曲线

目录 一、说明二、贝塞尔曲线特征三、模拟四、全部代码如下 一、说明 以下文章介绍了用 C 计算和绘制的贝塞尔曲线&#xff08;2D 和 3D&#xff09;。    贝塞尔曲线具有出色的数学能力来计算路径&#xff08;从起点到目的地点的曲线&#xff09;。曲线的形状由“控制点”决…

个体诊所门诊电子处方开单管理系统软件,配方模板病历模板设置一键导入操作教程

个体诊所门诊电子处方开单管理系统软件&#xff0c;配方模板病历模板设置一键导入操作教程 一、前言 以下操作教程以 佳易王诊所电子处方软件V17.2为例说明&#xff0c;最新版V17.3下载可以点击最下方官网卡片了解。 1、在现实生活中&#xff0c;医师开单可谓是争分夺秒&…