目录
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;
}