C++ Primer第三章③
C++ Primer
第三章 字符串、向量和数组
标准库类型vector
标准库类型vector表示对象的集合,其中所有对象的类型都相同。可以把vector看成一个容器,容器里面装的都是同一个类型的东西。 要想使用vector,必须包含适当的头文件
#include <vector>
using std::vector;
C++语言有类模板(class template),类模板本身不是类,可以讲类模板看成编译器生成类的说明,在我的理解中情况是这样的:
graph LR
类模板-->类
graph LR
类-->对象
类模板实例化为类,类实例化为对象。 对于类模板来说,我们需要提供一些额外的信息来指定类模板到底实例化成什么样的类。 以vector为例:
vector<int> vec1; //vec1保存int对象
vector<vector<int>> vec2; //vec2保存vector<int>对象
定义和初始化vector对象
下面列出了所有的初始化方法,挑顺手的用就行,不过都得看得懂别人的代码
vector<int> v1; //默认初始化,空vector
vector<int> v2(v1);
vector<int> v3 = v1;
vector<string> v4(5, "c"); //有5个字符串"c"
vector<int> v5(5); //包含了5个重复执行默认初始化的对象,就是5个0
vector<int> v6{1, 2, 3};
vector<int> v7 = {1, 2, 3};
下面搞点花样,不清楚的看代码注释,清楚的看看就好了
vector<string> v1("a", "b"); //错误
vector<string> v2{"a", "b"}; //正确:列表初始化
vector<int> v3(10, -1); //正确:10个-1
vector<int> v4{10, -1}; //正确:10,-1
vector<int> v5(10); //10个0,值默认初始化
vector<string> v6(10); //10个空string对象
向vector对象中添加元素
从标准输入中读取单词,存进vector中
string word;
vector<string> text;
while(cin >> word)
{
text.push_back(word);
}
为什么叫push_back呢?因为翻译过来就是尾插,就是插在后面(好像有点不对劲),比如输入是"a"
"b" "c",那么在text中的顺序也是{"a",
"b", "c"} 在开始时创建空的对象,在运行时再添加元素,这个做法与C和Java等其他语言都不太一样,但这样可以在不知道预先有多少输入的时候使用,而且C++设计者也保证了高效快速地插入元素
我自己经常犯的一个错就是vector越界,希望大家注意,有一个准则是不会错的,如果在循环体内部包含有向vector对象添加元素的语句,则最好不要使用for循环,原因也很明显,反正我犯过这样的错误 因为vector什么类型的元素都能装,一定要注意只有当元素的值可比较时,vector对象才能被比较。
不能用下标形式添加元素,添加元素暂时只能用Push_back,下标只是提供一种访问元素的方式,换句话说,下标只能访问元素,不能创造添加元素