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;
}
相关推荐
TMDOG66613 分钟前
TMDOG的Gin学习笔记_02——Gin集成支付宝支付沙箱环境
笔记·学习·gin
cliff,16 分钟前
【密码学】密钥管理
学习·安全·密码学
GeekAlice25 分钟前
算法笔记/USACO Guide GOLD金组Graphs并查集Disjoint Set Union
c++·经验分享·笔记·学习·算法
阿七想学习1 小时前
数据结构《链表》
java·开发语言·数据结构·学习·链表
VertexGeek1 小时前
Rust学习(三):rust基础Ⅱ
开发语言·学习·rust
南宫理的日知录2 小时前
106、Python并发编程:深入浅出理解线程池的内部实现原理
开发语言·python·学习·编程学习
懒惰的bit8 小时前
基础网络安全知识
学习·web安全·1024程序员节
Natural_yz10 小时前
大数据学习09之Hive基础
大数据·hive·学习
龙中舞王10 小时前
Unity学习笔记(2):场景绘制
笔记·学习·unity
Natural_yz11 小时前
大数据学习10之Hive高级
大数据·hive·学习