C++学习 --vector

目录

1, 什么是vector

2, 创建vector

3, 赋值(assgin)

4, 插入元素(insert)

5, 尾插(push_back)

6, 查询(at)

7, 首元素(front)

8, 尾元素(back)

9, 获取长度(size)

10, 交换(swap)

11, 尾删(pop_back)

12, 删除元素(erase)

13, 清空元素(clear)

14, 空判断(empty)

15, 嵌套vector


1, 什么是vector

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

2, 创建vector

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

#include <iostream>
#include <string>
#include <vector>

using namespace std;

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

int main()
{
	Myclass m1("aaa", 1);
	Myclass m2("bbb", 2);
	
	//内置数据类型
	vector<string> v1;
	vector<string> v2 = { "a", "b", "c" };

	//自定义数据类型
	//容器中元素的类型为Myclass
	vector<Myclass> v3 = {m1, m2};
	//拷贝构造方式创建
	vector<Myclass> v4(v3);
	//通过区间方式创建
	vector<Myclass> v5(v1.begin(), v1.end());
	//vector v4中有5个m1
	vector<Myclass> v6(5, m1);

	system("pause");

	return 0;
}

3, 赋值(assgin)

assign()是用新元素替换原来的元素, 可通过指定迭代器区间替换或者指定元素替换, 注意参数不能仅是单个vector对象

#include <iostream>
#include <string>
#include <vector>

using namespace std;

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

int main()
{
	Myclass m1("aaa", 1);
	Myclass m2("bbb", 2);
	
	//内置数据类型
	vector<string> v1 = {};
	vector<string> v2 = { "a", "b", "c" };

	//v1的元素为{ "a", "b", "c" }
	v1.assign(v2.begin(), v2.end());
	//v2的元素为{ "a", "a", "a", "a", "a"}
	v2.assign(5, "a");

	//自定义数据类型
	//容器中元素的类型为Myclass
	vector<Myclass> v3;
	vector<Myclass> v4 = {m1, m2};
	//v3为{m1, m2}
	v3.assign(v4.begin(), v4.end());
	//v4为{m1, m1, m1, m1, m1}
	v4.assign(5, m1);

	system("pause");

	return 0;
}

4, 插入元素(insert)

insert通过迭代器指定插入元素的位置, 插入元素, 支持一次添加多个元素

#include <iostream>
#include <string>
#include <vector>

using namespace std;

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

int main()
{
	Myclass m1("aaa", 1);
	Myclass m2("bbb", 2);
	
	//内置数据类型
	vector<string> v1 = { "a", "b", "c" };
	//在首元素处插入3个e, v1变为{ "e", "e", "e", "a", "b", "c" }
	v1.insert(v1.begin(), 3, "e");

	//通过首元素迭代器++, 指定插入索引位置
	vector<string>::iterator it = v1.begin();
	it++;
	//在第一个元素处插入2个f, v1变为{ "e", "f", "f", "e", "e", "a", "b", "c" }
	v1.insert(it, 2, "f");

	//由于vector v1变换到新的空间, 所以这里需要重新定义首元素迭代器
	vector<string>::iterator it1 = v1.begin();
	it1++;
	it1++;
	//不指定插入元素的数量, 默认插入1个
	//在第二个元素处插入1个g, v1变为{ "e", "f", "g", "f", "e", "e", "a", "b", "c" }
	v1.insert(it1, "g");

	//自定义数据类型
	vector<Myclass> v2 = {m1};
	//在首元素处插入2个m2, v2为{m2, m2, m1}
	v2.insert(v2.begin(), 2, m2);
	
	//通过首元素迭代器++, 制定插入索引位置
	vector<Myclass>::iterator it2 = v2.begin();
	it2++;
	//在第一个元素处插入2个m1, v2为{m2, m1, m1, m2, m1}
	v2.insert(it2, 2, m1);

	//由于vector v2变换到新的空间, 所以这里需要重新定义首元素迭代器
	vector<Myclass>::iterator it3 = v2.begin();
	it3++;
	it3++;
	//不指定插入元素的数量, 默认插入1个
	//在第二个元素处插入1个m2, v2变为{m2, m1, m2, m1, m2, m1}
	v2.insert(it3, m2);

	system("pause");

	return 0;
}

5, 尾插(push_back)

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

#include <iostream>
#include <string>
#include <vector>

using namespace std;

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

int main()
{
	Myclass m1("aaa", 1);
	Myclass m2("bbb", 2);
	
	//内置数据类型
	vector<string> v1 = { "a", "b", "c" };
	//vector v1变为{ "a", "b", "c", "d" }
	v1.push_back("d");

	//自定义数据类型
	vector<Myclass> v2 = {m1};
	//vector v2变为{ m1, m2 }
	v2.push_back(m2);

	system("pause");

	return 0;
}

6, 查询(at)

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

#include <iostream>
#include <string>
#include <vector>

using namespace std;

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

int main()
{
	Myclass m1("aaa", 1);
	Myclass m2("bbb", 2);
	Myclass m3("ccc", 3);
	
	//内置数据类型
	vector<string> v1 = { "a", "b", "c", "d"};
	//返回c
	cout << v1.at(2) << endl;

	//自定义数据类型
	vector<Myclass> v2 = {m1, m2, m3};
	//打印bbb 2
	cout << v2.at(1).m_name << " " << v2.at(1).m_age << endl;

	system("pause");

	return 0;
}

7, 首元素(front)

通过对象.front(), 获取对象的首元素

#include <iostream>
#include <string>
#include <vector>

using namespace std;

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

int main()
{
	Myclass m1("aaa", 1);
	Myclass m2("bbb", 2);
	Myclass m3("ccc", 3);
	
	//内置数据类型
	vector<string> v1 = { "a", "b", "c", "d"};
	//返回a
	cout << v1.front() << endl;

	//自定义数据类型
	vector<Myclass> v2 = {m1, m2, m3};
	//打印aaa 1
	cout << v2.front().m_name << " " << v2.front().m_age << endl;

	system("pause");

	return 0;
}

8, 尾元素(back)

通过对象.back(), 获取对象的首元素

#include <iostream>
#include <string>
#include <vector>

using namespace std;

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

int main()
{
	Myclass m1("aaa", 1);
	Myclass m2("bbb", 2);
	Myclass m3("ccc", 3);
	
	//内置数据类型
	vector<string> v1 = { "a", "b", "c", "d"};
	//返回d
	cout << v1.back() << endl;

	//自定义数据类型
	vector<Myclass> v2 = {m1, m2, m3};
	//打印ccc 3
	cout << v2.back().m_name << " " << v2.back().m_age << endl;

	system("pause");

	return 0;
}

9, 获取长度(size)

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

#include <iostream>
#include <string>
#include <vector>

using namespace std;

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

int main()
{
	Myclass m1("aaa", 1);
	Myclass m2("bbb", 2);
	Myclass m3("ccc", 3);
	
	//内置数据类型
	vector<string> v1 = { "a", "b", "c", "d"};
	//返回4
	cout << v1.size() << endl;

	//自定义数据类型
	vector<Myclass> v2 = {m1, m2, m3};
	//返回3
	cout << v2.size() << endl;

	system("pause");

	return 0;
}

10, 交换(swap)

通过对象1.swap(对象2) 交换两个vector的元素, 两个vector的数据类型需要一致, 否则报错

#include <iostream>
#include <string>
#include <vector>

using namespace std;

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

int main()
{
	Myclass m1("aaa", 1);
	Myclass m2("bbb", 2);
	Myclass m3("ccc", 3);
	
	//内置数据类型
	vector<string> v1 = { "a", "b", "c", "d"};
	vector<string> v2 = { "a1", "b1", "c1", "d1"};

	//自定义数据类型
	vector<Myclass> v3 = {m1, m2, m3};
	vector<Myclass> v4 = {m1, m2};

	//v1为{ "a1", "b1", "c1", "d1"}
	//v2为{ "a", "b", "c", "d"}
	v1.swap(v2);
	//v3为{m1, m2}
	//v4为{m1, m2, m3}
	v3.swap(v4);

	system("pause");

	return 0;
}

11, 尾删(pop_back)

通过对象.pop_back(), 删除对象尾部元素

#include <iostream>
#include <string>
#include <vector>

using namespace std;

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

int main()
{
	Myclass m1("aaa", 1);
	Myclass m2("bbb", 2);
	Myclass m3("ccc", 3);
	
	//内置数据类型
	vector<string> v1 = { "a", "b", "c", "d" };

	//自定义数据类型
	vector<Myclass> v2 = {m1, m2, m3 };

	//v1为{ "a", "b", "c", "d" }
	v1.pop_back();
	//v2为{ m1, m2 }
	v2.pop_back();

	system("pause");

	return 0;
}

12, 删除元素(erase)

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

#include <iostream>
#include <string>
#include <vector>

using namespace std;

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

int main()
{
	Myclass m1("aaa", 1);
	Myclass m2("bbb", 2);
	Myclass m3("ccc", 3);
	
	//内置数据类型
	vector<string> v1 = { "a", "b", "c", "d" };
	//删除单个元素
	v1.erase(v1.begin());
	//删除所有元素
	v1.erase(v1.begin(), v1.end());
	
	//自定义数据类型
	vector<Myclass> v2 = { m1, m2, m3 };
	//删除单个元素
	v2.erase(v2.begin());

	//删除所有元素
	v2.erase(v2.begin(), v2.end());

	system("pause");

	return 0;
}

13, 清空元素(clear)

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

#include <iostream>
#include <string>
#include <vector>

using namespace std;

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

int main()
{
	Myclass m1("aaa", 1);
	Myclass m2("bbb", 2);
	Myclass m3("ccc", 3);
	
	//内置数据类型
	vector<string> v1 = { "a", "b", "c", "d" };
	//清空元素
	v1.clear();
	
	//自定义数据类型
	vector<Myclass> v2 = { m1, m2, m3 };
	//清空元素
	v2.clear();

	system("pause");

	return 0;
}

14, 空判断(empty)

通过对象名.empty(), 判断vector元素是否为空, 为空返回1, 不为空返回0

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

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

int main()
{
	Myclass m1("aaa", 1);
	Myclass m2("bbb", 2);
	Myclass m3("ccc", 3);
	
	//内置数据类型
	vector<string> v1 = { "a", "b", "c", "d" };
	//清空元素
	v1.clear();
	//打印1
	cout << v1.empty() << endl;
	
	//自定义数据类型
	vector<Myclass> v2 = { m1, m2, m3 };
	//清空元素
	v2.clear();
	//打印1
	cout << v2.empty() << endl;

	system("pause");

	return 0;
}

15, 嵌套vector

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

#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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值