大家好呀!最近在家里闲来无事,deidei便想着想要学点什么。
于是便整理了一下vector容器的用法。
要想熟练掌握一个工具的用法,感觉光靠看网上的解释和用法总感觉还是无法系统的去了解vector的用法,多多少少还是感觉知识有些被碎片化。
还是自己动手来写一下才能熟练掌握,毕竟“实践出真知”嘛!于是便自己写了一个测试用例来展示vector各个函数的用法。写完了一下之后果然是对于vector的用法感到更加熟练了呢!
接下来贴上这段代码,希望对初学vector的小伙伴有所帮助。(不过还是希望大家能自己动手多写写,不要总是依赖网上的例子)
#include<iostream>
#include<vector>
#include<string>
using namespace std;
//vector容器的学习,以及其测试用例
void to_be_continued(const char* promp)
{
cout << promp << endl;
char c = 0;
while (c != '\n') {
c = getchar();
}
}
//写一个函数用于输出一个vector容器中的所有元素
//这个地方采用模板,从而可以输出各种类型的vector
template<typename T>
void PrintAll(const char* promp,const vector<T> v)
{
//顺便在这边展示一下v.begin()和v.end()的用法
//本质上v.begin()返回的是vector容器的首个元素地址,v.end()返回的是vector容器最后一个元素的地址
cout << promp;
//typename vector<T>::iterator i;
//_Vector_const_iterator<_Vector_val<_Simple_types<int>>> i
for (auto i = v.begin(); i != v.end(); i++) {
cout << *i<<" ";
}
cout << endl;
}
int main()
{
//希望自己写一个,这样可以加深对于vector使用方法的印象
if (1) {
to_be_continued("下面开始示范构造vector容器,按回车继续......");
vector<int> vi;//构造了一个空的vector容器
vector<int> vi1(5, 6);//构造了一个类型为int,有5个值,且5个值均为6的容器
vector<char> vc(5, 'a');//构造了一个类型为char,有5个值,且5个值均为'a'的容器
vector<string> vs(5, "hello");//构造了一个类型为string,有5个值,且5个值均为'a'的容器
//拷贝构造
vector<int> cvi1(vi1);//将前面已有的容器原封不动的拷贝过来
//运用迭代器赋值
char arr[3] = {'a','b','c'};
vector<char> arr_v(arr,arr+3);
//将他们输出看看是否和预期一样
PrintAll("vector<int> vi构造实际输出:",vi);
PrintAll("vector<int> vi1(5, 6)构造实际输出:", vi1);
PrintAll("vector<char> vc(5, 'a')构造实际输出:", vc);
PrintAll("vector<string> vs(5, \"hello\")构造实际输出:", vs);
PrintAll("vector<int> cvi1(vi1)构造实际输出:", cvi1);
PrintAll("vector<char> arr_v(arr,arr+3)构造实际输出:", arr_v);
cout << endl;
to_be_continued("构造vector容器示范结束,按回车继续......");
}
if (1) {
to_be_continued("下面开始测试front()和back()的使用,按回车继续......");
//front()用于返回vector容器内存储的第一个元素,back()用于返回vector容器内最后一个元素
vector<int> v = { 1,2,3,4 };
cout << "v.front()应当输出1,实际输出:" << v.front() << endl;
cout << "v.back()应当输出4,实际输出:" << v.back()<<endl;
to_be_continued("测试front()和back()的使用结束,按回车继续......");
}
if (1) {
to_be_continued("下面开始测试size()、resize()、capacity(),empty()的使用,按回车继续......");
//
vector<char> hello = { 'h','e','l','l','o' };
cout << "输出hello.size(),应当输出5,实际输出:" << hello.size() << endl;
hello.resize(10);//改变他的大小
cout << "hello.resize(10),hello.capacity应当输出10,实际输出:" << hello.capacity() << endl;
cout << "hello.size()此时应当输出10,实际输出:" << hello.size() << endl;
cout << "hello.empty()应当输出0,实际输出:" << hello.empty() << endl;
hello.resize(15,'!');//改变他的大小,并在后面多出来的5个位置补上指定的字符
PrintAll("hello.resize(15,'!'),实际输出:", hello);
hello.resize(0);
cout << "hello.empty()应当输出1,实际输出:" << hello.empty() << endl;
to_be_continued("按回车继续......");
}
//要想搞钱,首先得提升技术硬实力
if (1) {
//下面演示push_back(),pop_back(),swap()
to_be_continued("下面开始测试push_back(),pop_back(),swap()的使用,按回车继续......");
vector<char> vc;
for (int i = 0; i < 26; i++) {
vc.push_back('A' + i);
}
PrintAll("试验push_back,26个字母:", vc);
for (int i = 0; i < 13; i++) {
vc.pop_back();
}
PrintAll("试验pop_back,删去末尾13个字母:", vc);
vector<char> hell = {'h','e','l','l'};
PrintAll("打印交换前hell:", hell);
PrintAll("打印交换前的vc:", vc);
vc.swap(hell);
PrintAll("打印交换后的hell:", hell);
PrintAll("打印交换后的vc:", vc);
to_be_continued("按回车继续......");
}
if (1) {
//下面演示逆序输出,利用rbegin(),rend()
to_be_continued("下面开始测试rbegin(),rend()的使用,按回车继续......");
vector<int> vi = { 1,2,3,4,5,6,7,8,9,0 };
PrintAll("正序输出:", vi);
cout << "下面展示逆序输出:";
for (auto i = vi.rbegin(); i != vi.rend(); i++) {
cout << *i << " ";
}
to_be_continued("按回车继续......");
}
if (1) {
//下面演示erase(),insert(),clear()
to_be_continued("下面开始测试erase(),insert(),clear()的使用,按回车继续......");
vector<int> vi = { 1,2,3,4,5 };
PrintAll("vi原来的样子:", vi);
//进行erase()
vi.erase(vi.begin());
PrintAll("vi删去第一个元素之后:", vi);
//进行insert()
vi.insert(vi.begin(), 1);
PrintAll("vi把第一个元素加上去之后:", vi);
//进行clear()
vi.clear();
cout << "用clear()成员函数之后,查看empty()的值:" << vi.empty()<<endl;
to_be_continued("按回车继续......");
}
if (1) {
//下面演示重载运算符,以及at()的使用
to_be_continued("下面开始测试p重载运算符,以及at()的使用,按回车继续......");
//演示[],以及at()
vector<char> china = { 'c','h','i','n','a' };
cout << "输出china,用下标的方式逐项输出:" << endl;
for (int i = 0; i < 5; i++) {
cout << china[i] << " ";
}
cout <<endl<< "输出china,用at()的方式逐项输出:" << endl;
for (int i = 0; i < 5; i++) {
cout << china.at(i)<< " ";
}
cout << endl;
to_be_continued("按回车继续......");
}
return 0;
}
- 在vector中要想要遍历vector的所有元素,有以下几种方法:(目前发现的,或许还有其他方法)
法一:用迭代器定义指针i(注意点:别忘了在vector::iterator前面加typename,不然会报错)
template<typename T>
void traverse(const vector<T> v)
{
//直接用
typename vector<T>::iterator i;
for (i = v.begin(); i != v.end(); i++) {
cout << *i<<" ";
}
cout << endl;
}`
法二:用自动变量auto,最不容易出错,也是最适用于遍历容器的方法
template<typename T>
void traverse(const vector<T> v)
{
for (auto i = v.begin(); i != v.end(); i++) {
cout << *i<<" ";
}
cout << endl;
}
法三:用原始方法:
template<typename T>
void traverse(const vector<T> v){
for(int i=0;i<v.size();i++){
cout<<v[i]<<" ";
}
}
希望以后可以继续坚持一边学习,一边写博文记录总结吧!
把在学习中的一些所见所想分享出来,一方面是督促自己这个小白加懒虫每天学点新知识的习惯,记录下自己的成长,另一方面也希望可以结交更多志同道合的小伙伴,在编程这条路上越走越远!
加油加油!!