本人为大一学生,上学期学习了C语言的基础知识,看过《C primer plus》《征服C指针》《C陷阱与缺陷》等有关C语言的名著。本学期学校开了C++的课,我想着不再买《C primer plus》这样大部头的书籍,因为上学期看到后面比较难的内容实在是比较痛苦,但又因为害怕有用,想要去学,就会在一些地方浪费大量的时间,而且这样的书籍虽然十分详细,但是全都慢慢看下来确实挺费时间,而且很多操作学完也会忘掉,尤其是像我这样的一个学生,对于一些高级的操作基本用不到,所以学了很快也就忘了。所以这学期想换个途径学习C++,但无奈实在是找不到合适的途径,无论是看视频还是浏览网站,发现都不适合我,找不到一个方向,就像在森林里面乱走一样。所以本学期我又买了《C++ primer》这样的大部头书开始自学C++,着实是无奈之举。这样的书要多看网上的意见挑着读,尽量能先把C++尽快的用起来,在实践中遇到问题再去翻书,会更有效果,学起来也更快。
回到正题!!!
在看到《C++ primer》第三章的时候,学到了vector容器的时候,发现《C++ primer》这本书上的内容突然理解起来有一定难度,估计是增添的面向对象的知识令人一时间难以理解,我还在用C语言的知识去理解C++,容易钻牛角尖。于是找了个简单视频开始了解vector这个容器,发现书上讲的实在是让人摸不到北,估计是太详细了。并不是说书不好,有一定理解再去看书才会真正发现书的作用。
本文章是面对初学者的,相信看完之后一定能帮助大家初步理解vector这个好用又无比厉害的容器。
vector虽然直译为“向量”,但实际上就是一个动态数组,可以先这样理解,下文中小标题称vector为容器,但小标题下的内容又称为动态数组,两者一样,只不过是两种叫法而已。我现在理解它为动态数组,所以就这样称呼了。
使用vector容器需要包含头文件#include<vector>,它被定义在了<vector>这个头文件中
当然也不要忘了命名空间的区域限制。
using namespace std;
using std::vector;
能学到vector容器的一些同学想必虽然不是很能理解命名空间的具体意义,但是也应该知道了需要用上这些代码。
头文件加上这些命名空间就可以使用vector容器了。
1.vector容器的定义方式。
vector容器的定义方式为vector<数据类型> /*对象名*/。
例如vector<int> ivec;//该句意思就是定义一个叫ivec的int类型的动态数组。
当然也可以定义其他类型的数据,先从简单的开始,等理解了意思,自己就可以根据情况自己操作了。
2.向vector容器中添加元素。
用push_back(所需添加的数据)可以在动态数组的最后插入一个新的元素,比如
执行完此操作后,相当于逐个为数组中添加了5个int类型数据 [1,2,3,4,5].
如果输出出来就像下面这样,输出操作在文章的后面,不会也不用急,慢慢来。
当然也有其他很多种赋值方式,剩下的赋值方法以及具体细节等你在实践中遇到问题再去慢慢了解,这里指带着大家快速入门。
/*这里ivec.push_back(1)前面的ivec.就暂且把它理解为C语言结构体中访问结构体中的成员的操作,因为vector在C++中属于类,这个不理解也不用急,可以先用C语言结构体去理解,但随着后面的逐渐深入,一定要把类与结构体区别开来,两者不能混为一谈。*/
下面的回答很专业,但也不容易理解,可以看完本文章再去进行理解。
3.容器vector中元素的删除。
如果想删除数组中的元素,可以使用pop_back()进行删除动态数组最后一个元素,这个括号内不需要添加任何东西。!!!如果动态数组内已经为空,再使用pop_back就会出现错误!!!
像这样执行三次,便删除掉了数组中的3,4,5这三个数据,对应的下标分别为ivec[2],ivec[3],ivec[4],此时数组中还剩下了1和2这两个元素。在这里可没有ivec[5]这一操作哦,数组越界可是一个很大的问题。
4.容器vector中获取数组的长度。
如果想知道动态数组的长度,需要使用 /*数组名称*/.size() 例如ivec.size()。这样就可以在循环中利用它来作为判断条件了。
访问动态数组中的每个元素就像访问普通数组的元素一样,比如ivec[0]这样的操作,数组大小范围也是ivec.size()-1,和普通数组一样。注意这里我把i定义为unsigned int类型(int可以省略)是因为ivec.size()返回值就是无符号类型,实际上类型是 std::size_t,由于std::size_t就是无符号的整数类型,所以我干脆就定义为unsigned类型了,要不然底下有警告,虽然不影响操作,但本人强迫症极为难受。
这样让decltype去自己识别ivec.size()的类型也行,主要是试着玩玩,真要写没人这样写。
我如果把i定义为int类型就会出现这样的警告,大致意思就是用了两个不同类型的数据进行比较是不被允许的,用int类型数据和unsigned类型数据进行比较,在这里没有问题,如果在一些地方int为负数,那么麻烦就不小了。
5.输出容器vector中的数据。
输出动态数组里面的内容操作像这样
6.修改容器vector中的某个元素的值。
如果想修改数组中的某个值也同普通数组一样
7.清空并释放容器vector所占用的内存。
如果想清空动态数组中的所有数据并且释放掉内存的操作为vector<数据类型>().swap(对象名),像这样:
我是先检查一下动态数组中是否为空,如果不为空再进行清除,对象名.empty(),在这里为ivec.empty()他的返回值为当容器为空时,.empty()
返回true
;当容器包含至少一个元素时,返回false
。在这里因为前面存储的有int类型的数据,则返回false,那么(!ivec.empty())就表示非空,即为真,执行下面的清空操作。
这是自己写这篇文章用的完整代码,有点乱,勉强能看。
运行如下
先就这样简单的介绍一下,更复杂的操作我其实也不会,主要是帮助大家理解一下。因为大一上学期用C语言敲了很多代码,包括过年在家自学的一点数据结构方面的知识也是用C语言实现的,可能在某些操作和代码的实现上还保留了很多C语言操作的风格和习惯,我自己是意识不到,如果有朋友能看出来,欢迎指正!我是第一次写文章,如果此文章哪里有问题或是有存疑的地方,也欢迎大家指出,这样我也能意识到问题,更好的进步。 蟹蟹大家了!!!!!!