【二十八】【C++】vector类的运用复习

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;//创建空的vector
    show(vec);
    vector<int> vec1(10);//创建10个元素,初始化为int的默认构造函数
    show(vec1);
    vector<int> vec2(5, 9);//创建5个元素,初始化为9
    show(vec2);
    vector<int> vec3{1, 2, 3, 4, 5};//列表初始化,12345
    show(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();//清空vector
    show(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_backpop_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()方法检查vec2vec是否为空,并打印结果。

使用.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方法交换vecvec2的内容,并分别显示它们的新内容。

结尾

最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。

同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。

谢谢您的支持,期待与您在下一篇文章中再次相遇!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

妖精七七_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值