?注:如果只想学使用,直接看第二大点
容器之一:vector
单词 vector? 意思是“向量,矢量,载体……”? 你可以读成 “微可脱尔”,哈哈哈
?其实就是个动态数组,通俗的讲就是个高级一点的数组而已,一般的普通数组一旦建立了后其大小就不可以再改变了,但是这个高级的数组vector就高级在建立了以后其大小依然还是可改变的,想多大就多大,大到内存爆炸,想多小就多小,小到为0,这就是它的牛掰之处了,所以它有一个超级厉害的特点:在它的尾巴处添加或者删除的时间复杂度为O(1),只需要记住在尾巴处插入或者删除很快就行,至于怎么个快法,你就当比走路快一点点就行了(涉及其他知识,学完其他容器就知道了)
一句话就是:vector 是数组的高级版,大小随“心”所欲,尾巴处增删比较方便。完事
?接下来看它的所有操作:
使用前记得先添加头文件:
#include <vector>
① vector< Type?> name ;? ? ? ? ? 就是:? vector <数据类型> ?你想取的名字? ;
②
vector < int > myVector = { 1,2,3,4,5 }; //和数组一样的功能
③ 当变量用,直接用 “=” 给它赋值
vector < int > aa = { 1,2,3 };
int bb[5] = {1,2,3,4,5}
vector < int > myVector = aa; //直接把一个高级数组 aa 当一个具体数值用
vector < int > myVector = bb; //直接无视 bb 的大小,只要它是 int 类型就行
④当函数用,
//注意参数类型 和参数个数
vector < int > myVector(n); //参数为一个正整数,创建一个大小为n的高级数组,默认为0
vector < int > myVector(n,num); //参数为一个正整数和数值, 创建一个大小为n、默认为num的高级数组
vector < int > myVector(testVector); //创建一个完全等于testVector 的新高级数组
vector < int > myVector (*p, *q); // 理解为把 起始地址为 *p ,结束地址为 *q-1 的一段数据复制给新数组myVector
注意:!!!!!!!!!!!!!!!!!!!!!!!!!
vector < int > aa = { 1,2,3 };
vector < int > myVector = aa;? ?等于? vector < int > myVector( aa );
⑤二维动态数组,也就是 vector< Type?> name 里的类型?Type? 也为 vector 类型 ,即就是
…………
够用了
…………
①访问:
可以使用下标操作符?[]
?来访问,还可以使用? .at(index)来访问, 还可以使用迭代器 vector<int> :: iterator it? 来访问
vector<int> myVector = { 100,200,300,400 };
cout << myVector[0] << endl; // 100
cout << myVector[1] << endl; // 200
cout << myVector[2] << endl; // 300
cout << myVector[3] << endl; // 400
或者
cout << myVector.at(0) << endl; // 100
cout << myVector.at(1) << endl; // 200
cout << myVector.at(2) <<endl; // 300
cout << myVector.at(3) << endl; // 400
或者
vector<int> :: iterator it=aa.begin();
cout << *it << endl; // 100
cout << *it+1 << endl; // 200
cout << *it+2 <<endl; // 300
cout << *it+3 << endl; // 400
②增删改查
增加:?push_back() 和??
insert()? 和 emplace() ,后两个是属于迭代器的函数,STL里面的很多容器都可以使用,而且一般vector 只用于不涉及在中间进行插入或者删除操作的情况,因为时间复杂度比较高,不合适,有其他更合适的容器,所以说,虽然一般不这么用,但是我们要知道它是可以在中间增加、删除的,至于怎么用就不多说了
使用?push_back()
?函数将元素添加到 vector 的末尾,默认且只能添加到末尾
vector<int> myVector = { 1,2,3,4 };
myVector.push_back(100);
myVector.push_back(200);
myVector.push_back(300);
//输出内容是:1 2 3 4 100 200 300
for (int i = 0; i < myVector.size(); i++) {
cout << myVector[i] << " ";
}
cout << endl;
删除:
同样有?pop_back()
? 和??erase()? 和? remove() ,后两个同理,可以用,但不合适
使用?pop_back()
?函数删除 vector 末尾的元素,默认且只能删除末尾的元素 。
vector<int> myVector = { 100,200,300,400,500 };
myVector.pop_back();
myVector.pop_back();
cout << myVector.size() << endl; // 3
//输出内容是:100 200 300
for (int i = 0; i < myVector.size(); i++) {
cout << myVector[i] << " ";
}
cout << endl;
修改:
使用下标操作符 [] 来修改、 使用 .at(index)来修改 、还可使用迭代器 *it = 来修改
vector<int> myVector = { 100,200,300,400,500 };
myVector[0] = 111; // 修改索引为0的元素
myVector[1] = 222; // 修改索引为1的元素
//输出内容是:111 222 300 400 500
myVector.at(0) = 333; // 修改索引为0的元素
myVector.at(1) = 444; // 修改索引为1的元素
//输出内容是:333 444 300 400 500
vector<int>::iterator it = myVector.begin();
*it = 555;
*(it+1) = 666;
//输出内容是:555 666 300 400 500
查找:
使用?find()
?函数来查找指定值的元素,或者使用迭代器来遍历查找。
vector<int> myVector = { 100,200,300,400,500,600 };
vector<int>::iterator it = find(myVector.begin(), myVector.end(), 500);
//输出内容为:目标元素的索引为: 4
if (it != myVector.end()) {
cout << "目标元素的索引为: " << distance(myVector.begin(), it) <<endl;
}
else {
cout << "没有找到" <<endl;
}
vector<int> myVector = { 100,200,300,400,500,600 };
bool found = false;
int valueToFind = 300;
//输出内容为:目标元素的索引为: 2
for (vector<int>::iterator it = myVector.begin(); it != myVector.end(); ++it) {
if (*it == valueToFind) {
cout << "目标元素的索引为: " << distance(myVector.begin(), it) << endl;
found = true;
break;
}
}
if (!found) {
cout << "没有找到" << endl;
}
使用clear()
?函数可以清空 vector 中的所有元素。
vector<int> myVector = { 100,200,300,400,500,600 };
cout << myVector.size() << endl; // 6
myVector.clear();
cout << myVector.size() << endl; // 0
使用for循环和索引来遍历 vector 中的元素。
vector<int> myVector = { 100,200,300,400,500,600 };
//输出内容是:100 200 300 400 500 600
for (int i = 0; i < myVector.size(); i++) {
cout << myVector[i] << " ";
}
cout << endl;
vector<int> myVector = { 100,200,300,400,500,600 };
//输出内容是:100 200 300 400 500 600
for (vector<int>::iterator it = myVector.begin(); it != myVector.end(); it++) {
cout << *it << " ";
}
cout << endl;
在这个例子中,使用的是范围-based for 循环(也称为foreach循环),其中?int it
?是一个迭代变量,而不是传统的迭代器。这种循环方式是C++11引入的一种简化语法,用于遍历容器中的元素。
for (int it : myVector){},这里需要指定myVector中元素的类型,因为我定义的myVector元素类型是int,这里就使用int
vector<int> myVector = { 100,200,300,400,500,600 };
//输出内容是:100 200 300 400 500 600
for (int it : myVector) {
cout << it << " ";
}
cout << endl;
这种遍历方式使用了C++11引入的范围-based for 循环,也称为foreach循环。在这种循环中,auto it
?是一个自动类型推断的语法,it
?并不是一个传统意义上的迭代器,而是直接取得?myVector
?中的每个元素的值。
for (auto it : myVector){},这里直接使用auto,不需要根据myVector中元素的类型改变
vector<int> myVector = { 100,200,300,400,500,600 };
//输出内容是:100 200 300 400 500 600
for (auto it : myVector) {
cout << it << " ";
}
cout << endl;