C++学习 --vector

目录

[1, 什么是vector](#1, 什么是vector)

[2, 创建vector](#2, 创建vector)

[2-1, 标准数据类型](#2-1, 标准数据类型)

[2-2, 自定义数据类型](#2-2, 自定义数据类型)

[2-3, 其他创建方式](#2-3, 其他创建方式)

[3, 操作vector](#3, 操作vector)

[3-1, 赋值](#3-1, 赋值)

[3-2, 添加元素](#3-2, 添加元素)

[3-2-1, 添加元素(assign)](#3-2-1, 添加元素(assign))

[3-2-1-1, 标准数据类型](#3-2-1-1, 标准数据类型)

[3-2-1-2, 自定义数据类型](#3-2-1-2, 自定义数据类型)

[3-2-2, 添加元素(insert)](#3-2-2, 添加元素(insert))

[3-2-2-1, 标准数据类型](#3-2-2-1, 标准数据类型)

[3-2-2-2, 自定义数据类型](#3-2-2-2, 自定义数据类型)

[3-2-3, 添加元素(push_back)](#3-2-3, 添加元素(push_back))

[3-2-3-1, 标准数据类型](#3-2-3-1, 标准数据类型)

[3-2-3-2, 自定义数据类型](#3-2-3-2, 自定义数据类型)

[3-3, 查询(at)](#3-3, 查询(at))

[3-3-1, 标准数据类型](#3-3-1, 标准数据类型)

[3-3-2, 自定义数据类型](#3-3-2, 自定义数据类型)

[3-4, 获取容量(capacity)](#3-4, 获取容量(capacity))

[3-5, 获取长度(size)](#3-5, 获取长度(size))

[3-6, 交换(swap)](#3-6, 交换(swap))

[3-7, 删除元素(erase)](#3-7, 删除元素(erase))

[3-8, 清空元素(clear)](#3-8, 清空元素(clear))

[4, 嵌套vector](#4, 嵌套vector)


1, 什么是vector

C++中的一种容器 数据类型, 也叫单端数组,动态扩展, 并不是在原空间上进行扩展,而是重新 找更合适的内存空间 , 将原来的数据拷贝到新空间 ,并释放原来的空间, 迭代器支持随机访问

2, 创建vector

通过vector <数据类型> 对象名 , 可创建vector, 数据类型可以是标准数据类型 , 也可以是自定义类型

2-1, 标准数据类型

cpp 复制代码
//指定容器中元素数据类型为string
vector<string> v1;

2-2, 自定义数据类型

cpp 复制代码
class Myclass
{
public:
	Myclass() {};
	Myclass(string name, int age) :m_name(name), m_age(age) {};
	string m_name;
	int m_age;
};

Myclass m("aaa", 1);
//容器中元素的类型为Myclass
vector<Myclass> v1;

2-3, 其他创建方式

cpp 复制代码
Myclass m("aaa", 1);
vector<Myclass> v1;
//拷贝构造方式创建
vector<Myclass> v2(v1);
//通过迭代器容器方式创建
vector<Myclass> v3(v1.begin(), v1.end());
//创建v4, 并插入5个m对象
vector<Myclass> v4(5, m);

3, 操作vector

3-1, 赋值

通过vector<数据类型> 对象名2 = 对象名1, 进行赋值

cpp 复制代码
vector<Myclass> v1;
vector<Myclass> v2 = v1;

3-2, 添加元素

3-2-1, 添加元素(assign)

assign是用新的元素替换原来vector的元素

3-2-1-1, 标准数据类型
cpp 复制代码
//通过迭代器区间方式进行赋值
v2.assign(v1.begin(), v1.end());
//给容器v1, 赋值5个字符串a
v1.assign(5, "a");
3-2-1-2, 自定义数据类型
cpp 复制代码
//通过迭代器区间方式进行赋值
v2.assign(v1.begin(), v1.end());

Myclass m("aaa", 1);
//容器中元素的类型为Myclass
vector<Myclass> v1;
//给容器v1, 赋值5个m对象
v1.assign(5, m);

3-2-2, 添加元素(insert)

insert是向vector指定位置 , 添加元素, 支持一次添加多个元素

3-2-2-1, 标准数据类型
cpp 复制代码
//表示在首元素位置, 以此插入3个字符串b
v1.insert(v1.begin(), 3, "b");
//表示在首元素位置, 插入字符串c
v1.insert(v1.begin(), "c");
3-2-2-2, 自定义数据类型
cpp 复制代码
Myclass m1("aaa", 1);
vector<Myclass> v1;
//在首元素处插入m1
v1.insert(v1.begin(), m1);
//在首元素处插入2个m1
v1.insert(v1.begin(), 2, m1);

3-2-3, 添加元素(push_back)

push_back是在vector的尾部 添加元素, 只能单个添加

3-2-3-1, 标准数据类型
cpp 复制代码
vector<string> v1;
v1.assign(3, "a");
//在尾部添加c
v1.push_back("c");
3-2-3-2, 自定义数据类型
cpp 复制代码
Myclass m1("aaa", 1);
Myclass m2("bbb", 2);
vector<Myclass> v1;
v1.assign(3, m1);
//在尾部添加m2
v1.push_back(m2);

3-3, 查询(at)

通过对象名[索引] 或者对象名.at(索引), 获取vector中的元素

3-3-1, 标准数据类型

cpp 复制代码
//通过索引方式查询
cout << v1[0] << endl;
//通过at方式查询
cout << v1.at(1) << endl;
//获取首元素
cout << v1.front() << endl;
//获取尾元素
cout << v1.back() << endl;

3-3-2, 自定义数据类型

cpp 复制代码
Myclass m1("aaa", 1);
Myclass m2("bbb", 2);
Myclass m3("ccc", 3);
vector<Myclass> v1;
v1.push_back(m1);
v1.push_back(m2);
v1.push_back(m3);

//通过索引方式查询
cout << v1[0].m_name << endl;
//通过at方式查询
cout << v1.at(1).m_name << endl;
//获取首元素
cout << v1.front().m_name << endl;
//获取尾元素
cout << v1.back().m_name << endl;

3-4, 获取容量(capacity)

通过对象名.capacity(), 获取vector的容量大小

cpp 复制代码
cout << v1.capacity() << endl;

3-5, 获取长度(size)

通过对象名.size(), 获取vector的元素个数

cpp 复制代码
cout << v1.size() << endl;

3-6, 交换(swap)

通过对象名1.size(对象名2)交换 两个vector的元素, 两个vector的数据类型需要一致

cpp 复制代码
v1.swap(v2);

3-7, 删除元素(erase)

通过对象名.erase(迭代器位置), 删除元素

cpp 复制代码
//指定迭代器位置删除元素
v1.erase(v1.begin());
//删除尾部元素
v1.pop_back();

3-8, 清空元素(clear)

通过对象名.clear(), 清空vector元素

cpp 复制代码
v1.clear();
//指定迭代器区间清空元素
v1.erase(v1.begin(), v1.end());

4, 嵌套vector

通过vector<vector<数据类型>> 对象名 , 可实现嵌套vector

cpp 复制代码
#include <iostream>
#include <string>
#include <vector>

using namespace std;

class Myclass
{
public:
	Myclass() {};
	Myclass(string name, int age) :m_name(name), m_age(age) {};
	string m_name;
	int m_age;
};

void print_v(vector<vector<Myclass>>& v)
{
	//it为外层vector的第一个元素迭代器
	for (vector<vector<Myclass>>::iterator it = v.begin(); it != v.end(); it++)
	{
		//vit为内层vector的第一个元素迭代器
		for (vector<Myclass>::iterator vit = (*it).begin(); vit != (*it).end(); vit++)
		{
			cout << vit->m_name << endl;
		}
	}
}

int main()
{
	Myclass m1("aaa", 1);
	vector<Myclass> v1;
	vector<vector<Myclass>> v2;
	v1.push_back(m1);
	v2.push_back(v1);

	print_v(v2);

	system("pause");

	return 0;
}
相关推荐
潮汐退涨月冷风霜1 小时前
机器学习之非监督学习(四)K-means 聚类算法
学习·算法·机器学习
GoppViper1 小时前
golang学习笔记29——golang 中如何将 GitHub 最新提交的版本设置为 v1.0.0
笔记·git·后端·学习·golang·github·源代码管理
羊小猪~~1 小时前
深度学习基础案例5--VGG16人脸识别(体验学习的痛苦与乐趣)
人工智能·python·深度学习·学习·算法·机器学习·cnn
Charles Ray2 小时前
C++学习笔记 —— 内存分配 new
c++·笔记·学习
我要吐泡泡了哦3 小时前
GAMES104:15 游戏引擎的玩法系统基础-学习笔记
笔记·学习·游戏引擎
骑鱼过海的猫1233 小时前
【tomcat】tomcat学习笔记
笔记·学习·tomcat
贾saisai5 小时前
Xilinx系FPGA学习笔记(九)DDR3学习
笔记·学习·fpga开发
北岛寒沫5 小时前
JavaScript(JS)学习笔记 1(简单介绍 注释和输入输出语句 变量 数据类型 运算符 流程控制 数组)
javascript·笔记·学习
铁匠匠匠6 小时前
从零开始学数据结构系列之第六章《排序简介》
c语言·数据结构·经验分享·笔记·学习·开源·课程设计
架构文摘JGWZ8 小时前
Java 23 的12 个新特性!!
java·开发语言·学习