首页 > 编程语言 >C++之STL整理(2)之vector超详用法整理

C++之STL整理(2)之vector超详用法整理

时间:2024-03-28 12:31:32浏览次数:24  
标签:std main cout STL 超详 int vector 整理 include

C++之STL整理(2)之vector用法(创建、赋值、方法)整理

注:整理一些突然学到的C++知识,随时mark一下
例如:忘记的关键字用法,新关键字,新数据结构


C++ 的vector用法整理


提示:本文为 C++ 中 vector构造、赋值、接口 的写法和举例


一、vector的初始化

  根据vector的以下封装好的构造函数,现在示例每种构造方式的创建:

vector构造函数:

vector<T> v; //默认构造函数
vector(v.begin(), v.end());//将v[begin(), end())区间中的元素copy给对象。
vector(n, elem);//构造函数将n个elem赋给对象。
vector(n);//构造函数将n个0或空赋值给对象。
vector(const vector &vec);//拷贝构造函数。

1、默认构造函数

创建一个空的vector。

#include <iostream>  
#include <vector>  
  
int main() {  
    std::vector<int> v; // 创建一个空的vector  
    std::cout << "Size of vector v: " << v.size() << std::endl; // 输出:Size of vector v: 0  
    return 0;  
}

2、拷贝构造函数copy区间

假设有一个已存在的vector,我们想要创建一个新的vector并拷贝其中一部分元素。

#include <iostream>  
#include <vector>  
  
int main() {  
    std::vector<int> v = {1, 2, 3, 4, 5};  
    std::vector<int> v2(v.begin(), v.begin() + 3); // 拷贝前3个元素  
      
    for (int num : v2) {  
        std::cout << num << " "; // 输出:1 2 3  
    }  
    std::cout << std::endl;  
    return 0;  
}

3、指定数量和元素值的构造函数

创建一个包含特定数量且所有元素都具有相同值的vector。

#include <iostream>  
#include <vector>  
  
int main() {  
    std::vector<int> v(5, 10); // 创建一个包含5个10的vector  
      
    for (int num : v) {  
        std::cout << num << " "; // 输出:10 10 10 10 10  
    }  
    std::cout << std::endl;  
    return 0;  
}

4、指定数量的构造函数

创建一个包含特定数量的vector,所有元素默认初始化为该类型的默认值(对于基本类型如int,默认值为0)。

#include <iostream>  
#include <vector>  
  
int main() {  
    std::vector<int> v(5); // 创建一个包含5个0的vector  
      
    for (int num : v) {  
        std::cout << num << " "; // 输出:0 0 0 0 0  
    }  
    std::cout << std::endl;  
    return 0;  
}

5、拷贝构造函数

从另一个已存在的vector创建一个新的vector,作为它的拷贝。

#include <iostream>  
#include <vector>  
  
int main() {  
    std::vector<int> v = {1, 2, 3, 4, 5};  
    std::vector<int> v2(v); // 使用拷贝构造函数创建v2,它是v的拷贝  
      
    for (int num : v2) {  
        std::cout << num << " "; // 输出:1 2 3 4 5  
    }  
    std::cout << std::endl;  
    return 0;  
}

二、vector的初始化-赋值

vector常用赋值方式:
assign(beg, end);//将[beg, end)区间中的数据拷贝赋值。
assign(n, elem);//将n个elem拷贝赋值。
vector& operator=(const vector  &vec);//重载=
Vector<T> = {,,,};//直接赋值一个数组
Vector<T>  {,,,};
swap(vec);// 与vec的元素互换。

1、.assign(beg, end) 赋值操作

使用区间迭代器将另一个容器或数组中的数据拷贝到vector中。

#include <iostream>  
#include <vector>  
#include <algorithm> // for std::next  
  
int main() {  
    std::vector<int> v = {1, 2, 3, 4, 5};  
    int arr[] = {6, 7, 8, 9, 10};  
      
    v.assign(std::begin(arr), std::end(arr)); // 赋值arr数组到v  
      
    for (int num : v) {  
        std::cout << num << " "; // 输出:6 7 8 9 10  
    }  
    std::cout << std::endl;  
    return 0;  
}

2、.assign(n, elem) 赋值操作

将n个值为elem的元素拷贝到vector中。

#include <iostream>  
#include <vector>  
  
int main() {  
    std::vector<int> v;  
      
    v.assign(5, 10); // 赋值5个10到v  
      
    for (int num : v) {  
        std::cout << num << " "; // 输出:10 10 10 10 10  
    }  
    std::cout << std::endl;  
    return 0;  
}

3、重载等号操作符 operator=

使用重载的等号操作符将一个vector的内容赋给另一个vector。

#include <iostream>  
#include <vector>  
  
int main() {  
    std::vector<int> v1 = {1, 2, 3, 4, 5};  
    std::vector<int> v2;  
      
    v2 = v1; // 使用重载的等号操作符赋值v1到v2  
      
    for (int num : v2) {  
        std::cout << num << " "; // 输出:1 2 3 4 5  
    }  
    std::cout << std::endl;  
    return 0;  
}

4、直接列表初始化 Vector<T> {,};

在创建vector对象时,直接使用列表初始化语法。

#include <iostream>  
#include <vector>  
  
int main() {  
    std::vector<int> v = {21, 22, 23, 24, 25}; // 直接列表初始化  
      
    for (int num : v) {  
        std::cout << num << " "; // 输出:21 22 23 24 25  
    }  
    std::cout << std::endl;  
    return 0;  
}

5、swap 函数

使用std::swap或vector的成员函数swap来交换两个vector的内容。

#include <iostream>  
#include <vector>  
#include <algorithm> // for std::swap  
  
int main() {  
    std::vector<int> v1 = {1, 2, 3};  
    std::vector<int> v2 = {4, 5, 6};  
      
    std::swap(v1, v2); // 使用std::swap交换v1和v2的内容  
      
    // 输出交换后的v1  
    for (int num : v1) {  
        std::cout << num << " "; 
    }
    std::cout << std::endl;  
    return 0;
}

三、数据得增删查改

vector数据存取操作,主要有at()、front()、back()接口和括号[]取得方法。
vector插入和删除操作,主要有insert、erase、clear、pushback、popback接口。

1、at(int id)接口

at成员函数用于通过索引访问元素,并且在索引越界时会抛出std::out_of_range异常。

#include <iostream>  
#include <vector>  
#include <stdexcept> // for std::out_of_range  
  
int main() {  
    std::vector<int> v = {10, 20, 30, 40, 50};  
      
    try {  
        std::cout << v.at(2) << std::endl; // 输出:30  
        std::cout << v.at(10) << std::endl; // 抛出std::out_of_range异常  
    } catch (const std::out_of_range& e) {  
        std::cerr << "Index out of range: " << e.what() << std::endl;  
    }  
      
    return 0;  
}

2、front()接口

front成员函数返回容器中第一个元素的引用。

#include <iostream>  
#include <vector>  
  
int main() {  
    std::vector<int> v = {10, 20, 30, 40, 50};  
      
    std::cout << v.front() << std::endl; // 输出:10  
      
    return 0;  
}

3、back()接口

back成员函数返回容器中最后一个元素的引用。

#include <iostream>  
#include <vector>  
  
int main() {  
    std::vector<int> v = {10, 20, 30, 40, 50};  
      
    std::cout << v.back() << std::endl; // 输出:50  
      
    return 0;  
}

4、[id]直接取

operator[]通过索引直接访问元素,如果越界,行为是未定义的(通常会导致程序崩溃)。

#include <iostream>  
#include <vector>  
  
int main() {  
    std::vector<int> v = {10, 20, 30, 40, 50};  
      
    std::cout << v[2] << std::endl; // 输出:30  
    // std::cout << v[10] << std::endl; // 未定义行为,通常会导致程序崩溃  
      
    return 0;  
}

5、插入函数

insert(const_iterator pos, int count, ele)在迭代器pos指向的位置插入count个值为ele的元素。

#include <iostream>  
#include <vector>  
  
int main() {  
    std::vector<int> v = {10, 20, 40, 50};  
      
    v.insert(v.begin() + 1, 2, 30); // 在索引1的位置插入2个30  
      
    for (int num : v) {  
        std::cout << num << " "; // 输出:10 30 30 20 40 50  
    }  
    std::cout << std::endl;  
      
    return 0;  
}

6、尾部添加 push_back(ele)

在容器的尾部插入一个元素ele。

#include <iostream>  
#include <vector>  
  
int main() {  
    std::vector<int> v = {10, 20, 30};  
      
    v.push_back(40); // 在尾部插入40  
      
    for (int num : v) {  
        std::cout << num << " "; // 输出:10 20 30 40  
    }  
    std::cout << std::endl;  
      
    return 0;  
}

7、尾部删去 pop_back()

删去容器的最后一个元素。

#include <iostream>  
#include <vector>  
  
int main() {  
    std::vector<int> v = {10, 20, 30, 40};
    v.pop_back(); // 删除最后一个元素40  
  
	for (int num : v) {  
    	std::cout << num << " "; // 输出:10 20 30  
	}  
	std::cout << std::endl;  
  
	return 0;  
}

8、删区间

erase(const_iterator start, const_iterator end)删去从迭代器start到end(不包括end)之间的所有元素。

#include <iostream>  
#include <vector>  
  
int main() {  
    std::vector<int> v = {10, 20, 30, 40, 50};  
      
    v.erase(v.begin() + 1, v.begin() + 3); // 删除索引1到2之间的元素(即20和30)  
      
    for (int num : v) {  
        std::cout << num << " "; // 输出:10 40 50  
    }  
    std::cout << std::endl;  
      
    return 0;  
}

9、删指定位置

erase(const_iterator pos)删除迭代器pos指向的元素。

#include <iostream>  
#include <vector>  
  
int main() {  
    std::vector<int> v = {10, 20, 30, 40, 50};  
      
    v.erase(v.begin() + 2); // 删除索引2的元素(即30)  
      
    for (int num : v) {  
        std::cout << num << " "; // 输出:10 20 40 50  
    }  
    std::cout << std::endl;  
      
    return 0;  
}

10、清空

clear()删掉容器中的所有元素。

#include <iostream>  
#include <vector>  
  
int main() {  
    std::vector<int> v = {10, 20, 30, 40, 50};  
      
    v.clear(); // 删除所有元素  
      
    if (v.empty()) {  
        std::cout << "Vector is empty." << std::endl; // 输出:Vector is empty.  
    }  
      
    return 0;  
}

这些操作提供了对vector容器内容的灵活操作,可以轻松地插入和删除元素,以满足程序的需要。使用迭代器(或索引)时,请确保它们指向有效的容器位置,以避免未定义行为或异常。

四、其他接口

1、size()成员函数

返回容器中的元素个数。这个数量等于当前vector实际包含的元素数。

#include <iostream>  
#include <vector>  
  
int main() {  
    std::vector<int> v = {10, 20, 30, 40, 50};  
      
    std::cout << "Size of vector: " << v.size() << std::endl; // 输出:Size of vector: 5  
      
    return 0;  
}

2、empty()

empty成员函数检查容器是否为空。如果容器中没有元素,它返回true;否则返回false。

#include <iostream>  
#include <vector>  
  
int main() {  
    std::vector<int> v;  
      
    if (v.empty()) {  
        std::cout << "Vector is empty." << std::endl; // 输出:Vector is empty.  
    } else {  
        std::cout << "Vector is not empty." << std::endl;  
    }  
      
    return 0;  
}

3、resize(int num)

resize成员函数用于改变容器的大小。如果新的大小num大于当前大小,则容器会增长,新添加的元素会被初始化为默认值(对于内置类型,通常是0)。如果num小于当前大小,则末尾超出的元素会被删除。

#include <iostream>  
#include <vector>  
  
int main() {  
    std::vector<int> v = {10, 20, 30};  
      
    v.resize(5); // 容器增长,新元素初始化为0  
    for (int num : v) {  
        std::cout << num << " "; // 输出:10 20 30 0 0  
    }  
    std::cout << std::endl;  
      
    v.resize(2); // 容器缩短,超出的元素被删除  
    for (int num : v) {  
        std::cout << num << " "; // 输出:10 20  
    }  
    std::cout << std::endl;  
      
    return 0;  
}

resize(int num, elem) 是resize的另一种重载形式。它允许你为新的元素指定一个初始值elem。如果容器增长,新添加的元素会被初始化为elem。

#include <iostream>  
#include <vector>  
  
int main() {  
    std::vector<int> v = {10, 20, 30};  
      
    v.resize(5, 42); // 容器增长,新元素初始化为42  
    for (int num : v) {  
        std::cout << num << " "; // 输出:10 20 30 42 42  
    }  
    std::cout << std::endl;  
      
    return 0;  
}

4、capacity()

capacity成员函数返回容器当前分配的存储空间大小。这通常大于或等于size返回的值,因为vector为了效率可能会预留一些额外的空间。

#include <iostream>  
#include <vector>  
  
int main() {  
    std::vector<int> v = {10, 20, 30};  
      
    std::cout << "Size: " << v.size() << ", Capacity: " << v.capacity() << std::endl;  
    // 输出可能类似于:Size: 3, Capacity: 3 或 Size: 3, Capacity: 4(取决于实现)  
      
    return 0;  
}

5、reserve(int len)

reserve成员函数用于预分配容器的存储空间。它并不改变容器的大小(即size的值不变),但会增加容器的capacity。预分配空间可以提高插入元素的效率,因为当容器需要增长时,它可能不需要重新分配整个存储空间。reserve成员函数用于预分配容器的存储空间,它可以帮助提高插入元素的效率,因为当容器需要增长时,如果已经有足够的预留空间,它就可以避免重新分配整个存储空间。

这里是一个更详细的例子,展示了如何使用reserve来预分配vector的存储空间:

#include <iostream>  
#include <vector>  
  
int main() {  
    std::vector<int> v;  
      
    // 初始时,size和capacity都是0  
    std::cout << "Initial size: " << v.size() << ", Initial capacity: " << v.capacity() << std::endl;  
      
    // 使用reserve预分配至少10个元素的存储空间  
    v.reserve(10);  
      
    // size仍然是0,因为我们没有添加任何元素  
    // 但capacity至少为10  
    std::cout << "After reserve, size: " << v.size() << ", Capacity: " << v.capacity() << std::endl;  
      
    // 添加元素,直到达到或超过预留的capacity  
    for (int i = 0; i < 15; ++i) {  
        v.push_back(i);  
    }  
      
    // size现在是15,因为我们添加了15个元素  
    // capacity可能已经增长,以容纳更多的元素  
    std::cout << "After adding elements, size: " << v.size() << ", Capacity: " << v.capacity() << std::endl;  
      
    return 0;  
}

输出可能类似于:

Initial size: 0, Initial capacity: 0  
After reserve, size: 0, Capacity: 10  
After adding elements, size: 15, Capacity: 20 (或更大,取决于实现)

capacity的确切值可能因不同的vector实现而异。在上面的例子中,当添加超过预留capacity的元素时,vector可能会再次分配内存,并可能增加其capacity。这样做是为了避免在每次添加元素时都重新分配内存,从而提高性能。在实践中,如果你知道将要向vector中添加大量元素,使用reserve来预分配足够的空间通常是一个好习惯,因为这可以避免不必要的内存分配和元素复制。

总结

标签:std,main,cout,STL,超详,int,vector,整理,include
From: https://blog.csdn.net/ULTRAmanTAROACE/article/details/137105986

相关文章

  • defrag" 命令的帮助信息,该命令用于对磁盘进行碎片整理操作
    Windows系统中"defrag"命令的帮助信息,该命令用于对磁盘进行碎片整理操作。下面是对其中的参数和选项的翻译:Volumes:/C|/AllVolumes:对每个卷只运行给定操作列表中的首选操作。/E|/VolumesExcept<volumepaths>:在每个卷上执行除了指定的操作外的所有操作。如果例外......
  • 【剑指offer】73. 数组中只出现一次的两个数字(超详解)
    题目链接acwingleetcode题目描述给你一个整数数组nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。找出只出现一次的那两个元素。你可以按任意顺序返回答案。你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。输入:nums=[1,2,......
  • SqlServer(3)SqlServer经典总结大全-数据库同步-基础知识整理-能力提升
    三、SQLServer同步复制技术实现步骤,配上详细步骤和代码语句和输出SQLServer的同步复制是一种确保数据在发布服务器和订阅服务器之间实时同步的技术。以下是同步复制的详细步骤,包括代码语句和可能的输出。1.准备工作确保两台服务器(发布服务器和订阅服务器)的网络连接是正......
  • 文件整理达人教你如何快速批量移动子文件夹文件至父文件夹,并一键删除空文件夹
    比如有很多商品文件夹,里面又分出主图、细节图等,现在因工作需要把主图、细节图这些子文件夹去掉,把子文件夹里面的文件放在商品名称的父文件夹中,如图:打开主图文件夹,我们可以看到文件名结构为数字编号的,如图:再打开细节图的文件夹,我们可以看到文件名结构也是为数字编号的,如图:......
  • 待整理
    在设计和实现基于资源的访问控制(Resource-BasedAccessControl,RBAC)系统时,数据库表的设计是关键的一部分。RBAC是一种流行的访问控制模型,它根据用户在组织中的角色来授予或拒绝其对资源的访问权限。在RBAC中,通常有以下几个核心概念:用户(Users):系统中的个体,他们希望访问系统资源......
  • C++ STL - 优先级队列及其模拟实现
    目录0.引言1.priority_queue介绍 1.1构造函数 1.2 priority_queue接口函数使用 1.3仿函数  1.4题目练习 2. priority_queue模拟实现2.1基本框架:2.2默认构造函数2.3基本函数2.4堆的向上以及向下调整0.引言优先队列(priority_queue)是一种......
  • C++ STL- list 的使用以及练习
    目录0.引言1.list介绍 2.list使用2.1构造函数2.2listiterator的使用 3listcapacity 4.listelementaccess 5.listmodifiers 6.list迭代器失效 7.list与vector对vector8.OJ题讲解 删除链表的倒数第N 个节点:0.引言本篇博客我们......
  • 【Python】Python基本数据类型(超详细)
    前言在上一篇文章我们简单介绍了一下Python,本章我们就开始正式学习Python,在此之前,考虑到Python环境有的小伙伴可能没有,所有我开了一个QQ群,里面有代码编辑器(PyCharm)的安装与破解使用,如果有大佬需要的话可以加群自行安装,这个群创建的目的也是方便各位讨论技术,QQ群号:455341......
  • 使用Docker搭建测试用例管理平台TestLink:简易指南
    简介Testlink是一款免费开源的测试管理软件,基于WEB的测试用例管理系统,主要功能是:测试项目管理、产品需求管理、测试用例管理、测试计划管理、测试用例的创建、管理和执行,并且还提供了统计功能。为了方便快速部署TestLink,并且保持环境的一致性,我们可以使用Docker进行搭建。本文将......
  • whistle.vase的基本用法
    安装w2installwhistle.vase使用启动whistle,进入127.0.0.1:8899/#plugins点击vase,进入vase页面创建对应模版引擎的文件不同的模版引擎用法参考:https://github.com/whistle-plugins/whistle.vase#whistlevase这里的模版引擎中除了whistle.vase内置的script引擎外,其他的......