vector类的创建
#include <iostream>
using namespace std;#include <vector>void show(vector<int> vec) {if (vec.empty()) {cout << "vector is empty." ;}for (auto x : vec) {cout << x << " ";}cout << endl;}
int main() {vector<int> vec;//创建空的vectorshow(vec);vector<int> vec1(10);//创建10个元素,初始化为int的默认构造函数show(vec1);vector<int> vec2(5, 9);//创建5个元素,初始化为9show(vec2);vector<int> vec3{1, 2, 3, 4, 5};//列表初始化,12345show(vec3);vector<int> vec4(vec3.begin(), vec3.end());//vector的迭代器初始化show(vec4);vector<int> vec5(vec4.begin(), vec4.begin() + 3);//vector的迭代器初始化show(vec5);vector<int> vec6(vec5);//vector的拷贝构造函数show(vec6);vector<int> vec7 = vec6;//vector的赋值运算符重载show(vec7);}
控制台:
vector is empty.
0 0 0 0 0 0 0 0 0 0
9 9 9 9 9
1 2 3 4 5
1 2 3 4 5
1 2 3
1 2 3
1 2 3
vector<int> vec;
:创建了一个空的vector<int>
对象vec
。
vector<int> vec1(10);
:创建了一个包含10个默认初始化(即值为0)的int
元素的vector<int>
对象vec1
。
vector<int> vec2(5, 9);
:创建了一个包含5个元素,每个元素都初始化为9的vector<int>
对象vec2
。
vector<int> vec3{1, 2, 3, 4, 5};
:使用初始化列表创建了一个包含5个元素(1, 2, 3, 4, 5)的vector<int>
对象vec3
。
vector<int> vec4(vec3.begin(), vec3.end());
:使用vec3
的迭代器范围来创建vec4
,复制了vec3
中的所有元素。
vector<int> vec5(vec4.begin(), vec4.begin() + 3);
:同样使用迭代器范围来创建vec5
,但这次只复制了vec4
中的前三个元素。
vector<int> vec6(vec5);
:使用vec5
来进行拷贝构造创建了vec6
,复制了vec5
中的所有元素。
vector<int> vec7 = vec6;
:使用赋值运算符将vec6
中的所有元素赋值给了新创建的vector<int>
对象vec7
。
vector类的访问
#include <iostream>
using namespace std;
#include <vector>
void show(vector<int> vec) {if (vec.empty()) {cout << "vector is empty." ;}for (auto x : vec) {cout << x << " ";}cout << endl;}
int main() {vector<int> vec;show(vec);vector<int> vec1(10);show(vec1);vector<int> vec2(10, 8);show(vec2);vector<int> vec3(10);int i = 0;for (auto& x : vec3) {x = i++;}show(vec3);cout << vec3[5] << " " << vec3[8] << " " << vec3[9] << endl;cout << vec3.at(5) << " " << vec3.at(8) << " " << vec3.at(9) << endl;cout << vec3.front() << " " << vec3.back() << endl;cout << vec3.at(10) << endl;//抛出异常之后的程序不会再执行,at可以检查范围,[]不能cout << vec3.at(5) << endl;//cout << vec[10] <<endl;}
控制台:
vector is empty.
0 0 0 0 0 0 0 0 0 0
8 8 8 8 8 8 8 8 8 8
0 1 2 3 4 5 6 7 8 9
5 8 9
5 8 9
0 9
terminate called after throwing an instance of 'std::out_of_range'what(): vector::_M_range_check: __n (which is 10) >= this->size() (which is 10)
vector<int> vec;
创建了一个空的vector<int>
对象vec
。
vector<int> vec1(10);
创建了一个包含10个默认初始化(即值为0)的int
元素的vector<int>
对象vec1
。
vector<int> vec2(10, 8);
创建了一个包含10个元素,每个元素都初始化为8的vector<int>
对象vec2
。
接下来,创建了另一个包含10个默认初始化的int
元素的vector<int>
对象vec3
。然后,通过for
循环,使用引用(auto& x
)遍历vec3
,将每个元素赋值为其在vector中的索引值。
使用operator[]
来访问并打印vec3
中索引为5、8、9的元素。
使用at
成员函数来访问并打印同样的元素,at
函数与operator[]
不同之处在于,它会检查索引是否越界,并在越界时抛出一个异常。
front()
和back()
分别用来访问vector的第一个和最后一个元素,并打印它们。
尝试使用at
访问索引为10的元素,这将抛出一个越界异常。因为vec3
的大小是10,索引范围是0到9,所以索引10是越界的。此行执行后,程序会因为未捕获的异常而终止,后面的代码不会被执行。
vector类的修改
#include <iostream>
using namespace std;
#include <vector>
void show(vector<int> vec) {if (vec.empty()) {cout << "vector is empty." ;}for (auto x : vec) {cout << x << " ";}cout << endl;}
int main() {vector<int> vec;show(vec);vector<int> vec1(10, 7);show(vec1);vector<int> vec2(10);int i = 0;for (auto& x : vec2) {x = i++;}show(vec2);vec2.push_back(10);//尾插vec2.push_back(100);vec2.push_back(1000);show(vec2);vec2.pop_back();//尾删show(vec2);vec2.push_back(200);show(vec2);vec2.pop_back();show(vec2);vec2.push_back(300);show(vec2);vec2.insert(vec2.begin(), 33);//指定位置前面插入元素,迭代器位置show(vec2);vec2.insert(vec2.begin() + 2, 44);show(vec2);vec2.insert(vec2.begin() + 4, 55);show(vec2);vec2.erase(vec2.begin());//删除指定位置的元素,迭代器位置show(vec2);vec2.erase(vec2.begin() + 2);show(vec2);vec2.erase(vec2.begin() + 4);show(vec2);vec2.erase(vec2.begin() + 2);show(vec2);vec2.erase(vec2.begin() + 1);show(vec2);vec2.clear();//清空vectorshow(vec2);}
控制台:
vector is empty.
7 7 7 7 7 7 7 7 7 7
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9 10 100 1000
0 1 2 3 4 5 6 7 8 9 10 100
0 1 2 3 4 5 6 7 8 9 10 100 200
0 1 2 3 4 5 6 7 8 9 10 100
0 1 2 3 4 5 6 7 8 9 10 100 300
33 0 1 2 3 4 5 6 7 8 9 10 100 300
33 0 44 1 2 3 4 5 6 7 8 9 10 100 300
33 0 44 1 55 2 3 4 5 6 7 8 9 10 100 300
0 44 1 55 2 3 4 5 6 7 8 9 10 100 300
0 44 55 2 3 4 5 6 7 8 9 10 100 300
0 44 55 2 4 5 6 7 8 9 10 100 300
0 44 2 4 5 6 7 8 9 10 100 300
0 2 4 5 6 7 8 9 10 100 300
vector is empty.
创建并展示空的vector (vec
)。
创建并展示一个包含10个元素,每个都初始化为7的vector (vec1
)。
创建一个大小为10的vector (vec2
),然后使用范围for循环将其每个元素设置为其索引值,并展示。
通过push_back
方法在vec2
的尾部依次添加元素10、100、1000,并展示每次添加后的结果。
使用pop_back
方法从vec2
的尾部移除一个元素,并展示结果。
再次使用push_back
和pop_back
方法演示添加和删除元素的过程。
通过insert
方法在vec2
的指定位置前插入元素(33、44、55),并展示每次插入后的结果。
使用erase
方法从vec2
中删除指定位置的元素,并展示每次删除后的结果。这部分代码逐步删除了几个特定位置的元素。
调用vec2.clear()
方法清空整个vector,然后使用show
函数展示清空后的结果,此时打印"vector is empty."。
vector类的大小和容量
#include <iostream>
using namespace std;
#include <vector>
void show(vector<int> vec) {if (vec.empty()) {cout << "vector is empty." ;}for (auto x : vec) {cout << x << " ";}cout << endl;}
int main() {vector<int> vec;show(vec);vector<int> vec1(10);show(vec1);int i = 0;for (auto& x : vec1) {x = i++;}show(vec1);cout << "vec1.size():" << vec1.size() << endl;cout << "vec.size():" << vec.size() << endl;vector<int> vec2(5, 8);show(vec2);cout << "vec2.size():" << vec2.size() << endl;cout << "vectemp.size():" << (vector<int> {1, 2, 3, 4, 5}).size() << endl;cout << "vec2.capacity:" << vec2.capacity() << endl;vec2.push_back(5);vec2.push_back(5);vec2.push_back(5);vec2.push_back(5);vec2.push_back(5);show(vec2);cout << "vec2.capacity:" << vec2.capacity() << endl;vec2.push_back(6);vec2.push_back(6);show(vec2);cout << "vec2.size():" << vec2.size() << endl;cout << "vec2.capacity:" << vec2.capacity() << endl;cout << "vec2.empty:" << vec2.empty() << endl;cout << "vec.empty:" << vec.empty() << endl;show(vec2);cout << vec2.size() << endl;vec2.resize(10);show(vec2);cout << vec2.size() << endl;vec2.resize(15);show(vec2);cout << vec2.size() << endl;vec2.resize(10);vec2.resize(17, 10);show(vec2);cout << vec2.size() << endl;cout << "vec2.capacity:" << vec2.capacity() << endl;vec2.reserve(30);cout << "vec2.capacity:" << vec2.capacity() << endl;vec2.reserve(20);cout << "vec2.capacity:" << vec2.capacity() << endl;}
控制台:
vector is empty.
0 0 0 0 0 0 0 0 0 0
0 1 2 3 4 5 6 7 8 9
vec1.size():10
vec.size():0
8 8 8 8 8
vec2.size():5
vectemp.size():5
vec2.capacity:5
8 8 8 8 8 5 5 5 5 5
vec2.capacity:10
8 8 8 8 8 5 5 5 5 5 6 6
vec2.size():12
vec2.capacity:20
vec2.empty:0
vec.empty:1
8 8 8 8 8 5 5 5 5 5 6 6
12
8 8 8 8 8 5 5 5 5 5
10
8 8 8 8 8 5 5 5 5 5 0 0 0 0 0
15
8 8 8 8 8 5 5 5 5 5 10 10 10 10 10 10 10
17
vec2.capacity:20
vec2.capacity:30
vec2.capacity:30
创建空的vector<int>
并显示。
创建包含10个默认初始化为0的元素的vector<int>
并显示。
通过for
循环遍历vec1
,将每个元素设置为其索引值,并再次显示。
打印vec1
和空的vec
的大小(.size()
)。
创建包含5个元素(全部为8)的vector<int>
并显示其大小。
创建一个临时的vector<int>
,并打印其大小。这个临时对象是在表达式中直接创建并用于调用.size()
方法的。
展示vec2
的初始容量(.capacity()
),然后通过多次调用push_back
方法添加元素,并显示容量的变化。
使用.empty()
方法检查vec2
和vec
是否为空,并打印结果。
使用.resize()
方法调整vec2
的大小,并通过调用show
函数显示调整后的效果和新的大小。
使用.reserve()
方法增加vec2
的容量,不改变当前元素的数量但是预留更多的空间以避免将来添加元素时重新分配。.reserve()
方法设置容量如果小于原来的capacity
不会有任何事情发生。
vector类的迭代器
#include <iostream>
using namespace std;
#include <vector>
void show(vector<int> vec) {if (vec.empty()) {cout << "vector is empty." ;}for (auto x : vec) {cout << x << " ";}cout << endl;}
int main() {vector<int> vec;show(vec);vector<int> vec1{1, 2, 3, 4, 5, 6, 7, 8, 9};show(vec1);vector<int> vec2(vec1);show(vec2);vector<int>vec3(vec1.begin() + 3, vec1.begin() + 6);show(vec3);for (auto it = vec1.begin(); it != vec1.end(); it++) {cout << *it << " ";}cout << endl;for (auto rit = vec1.rbegin(); rit != vec1.rend(); rit++) {cout << *rit << " ";}}
控制台:
vector is empty.
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
4 5 6
1 2 3 4 5 6 7 8 9
9 8 7 6 5 4 3 2 1
创建并显示一个空的vector<int>
。
使用初始化列表创建包含9个元素(1到9)的vector<int>
并显示。
复制vec1
创建vec2
,再次显示vec2
。
创建vec3
作为vec1
的部分复制,包含从vec1
的第4个元素到第6个元素(基于0的索引),并显示。
使用正向迭代器(iterator
)遍历并打印vec1
中的元素。.end()
表示最后一个元素的后一个位置
使用反向迭代器(reverse_iterator
)遍历并打印vec1
中的元素,这会以相反的顺序打印元素。.rbegin()
表示最后一个元素,.rend()
表示第一个元素前一个位置。
vector类的特殊成员
#include <iostream>
using namespace std;
#include <vector>
void show(vector<int> vec) {if (vec.empty()) {cout << "vector is empty." ;}for (auto x : vec) {cout << x << " ";}cout << endl;}
int main() {vector<int> vec;show(vec);vector<int> vec1{1, 2, 3, 4, 5, 6, 7, 8, 9};show(vec1);vector<int> vec2(vec1.begin(), vec1.end());show(vec2);vec1.assign(5, 10);show(vec1);vec1.assign(6, 8);show(vec1);vec1.assign(vec2.begin(), vec2.end());show(vec1);vec1.assign(vec2.begin(), vec2.begin() + 5);show(vec1);vec.swap(vec2);show(vec);show(vec2);}
控制台:
vector is empty.
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
10 10 10 10 10
8 8 8 8 8 8
1 2 3 4 5 6 7 8 9
1 2 3 4 5
1 2 3 4 5 6 7 8 9
vector is empty.
创建并显示一个空的vector<int>
。
使用初始化列表创建包含9个元素(1到9)的vector<int>
并显示。
使用vec1
的迭代器范围复制vec1
创建vec2
,再显示vec2
。
使用assign
方法将vec1
的内容替换为5个值为10的元素,并显示。
再次使用assign
方法将vec1
的内容替换为6个值为8的元素,并显示。
使用assign
方法将vec1
的内容替换为vec2
的完整内容,并显示。
使用assign
方法将vec1
的内容替换为vec2
的前5个元素的内容,并显示。
使用swap
方法交换vec
和vec2
的内容,并分别显示它们的新内容。
结尾
最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。
同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。
谢谢您的支持,期待与您在下一篇文章中再次相遇!