最近在leetcode上刷题是用的比较多的是STL中的vector, vector作为C中遗留的内置数组的一种替代,同时作为STL中的一部分,使得其初始化既可以采用数组的机理,又可以采用STL中的通用模式.
一.数组的习惯用法
1. int arr[5]
====>vector<int> vec(5)
vector< int > ivec( 10, -1 ); 定义了 ivec 它包含十个int型的元素 每个元素都被初始化为-1
2.对于内置数组,我们可以在定义的时候顺便进行初始化了,例如:int ia[ 6 ] = { -2, -1, 0, 1, 2, 1024 };
但是,对于vector,我们不能用同样的方法显式地初始化,但是可以将 vector 初始化为一个已有数组的全部或一部分,只需指定希望被用来初始化 vector 的数组的开始地址以及数组最末元的下一位置来实现,例如:
// 把 ia 的 6 个元素拷贝到 ivec 中
vector< int > ivec( ia, ia+6 );这里第二个参数是数组最后元素的下一个位置,这里ia是指针,因此这里参数也可以表示成指针的另一种方式&ia[0], &ia[6]
二.STL中的习惯用法
1. vector 可以被另一个 vector 初始化 或被赋给另一个 vector,这点在数组中做不到
eg:vector<int> vec1; vector<int> vec2(vec1); vec3 = vec1;
2.我们向 vector 中插入元素,是通过push_back()函数,并且注意当vector<int>
vec;时,声明的是一个空向量,因此,不能采用下标的方式访问元素,只有先通过push_back()函数加入元素后,才能采用下标的方式访问元素,但是下标方式仅能对确知已存在的元素进行下标操作。如果使用下标定位元素然后修改,只能是修改size以内的元素才能成功.一开始vector为空时,不能对其进行下标赋值。而要用push_back().
实验表明,对空vector通过push_back进去一个元素后,除了vec[0]有元素外,其他下标对应的也有元素,只不过是随机值,vector的size得到的只是push_back进去的元素个数.具体因为什么,目前还不知道。。。
vector<int> vec1;
vec1.push_back(3);
vec1.push_back(4);
vec1[6] = 2;
vec1[0] = 8;
cout << vec1.size() << "," << vec1[0]<< endl;//2,8
2.STL中常用的访问元素的方式是使用迭代器,而不是下标,eg:
for ( vector<int>::iterator it = text.begin();
it != text.end(); ++it )
cout << *it << ’ ‘;
3.注意:当我们用一个给定的大小定义一个 vector 时,例如 :
vector ia( 10 );
任何一个插入操作都将增加vector 的大小,而不是覆盖掉某个现有的元素:
vector<int> vec1(5);
vec1.push_back(3);
vec1.push_back(4);
for ( vector<int>::iterator it = vec1.begin();
it != vec1.end(); ++it )
cout << *it << ' ';//0 0 0 0 0 3 4,看来只能通过迭代器或者下标进行修改了
说了这么多,还是很少涉及到现实问题中的vector初始化,上面介绍的方法中,总结起来第一个通过push_back函数逐个元素初始化,第二种是通过先定义数组,然后将数组内容复制到vector中,对于二维的vector,不能像二维数组那样直接赋值了,只能逐个元素赋值了。。。
然后,针对push_back和下标操作,下标操作只对vector中实际含有的元素有效,记住这点就行了。有错请纠正,O(∩_∩)O谢谢!