综述:
1.今天学习vector的过程中遇到的一些问题记录下来,方便日后复习以及有相同疑惑的同学参考。
2.主要关于下标与迭代器写入与读取元素。
遇到的问题:
代码如下:
#include <iostream>
#include <vector>
using namespace std;
int main(){
unsigned int i;
vector<int> v1;
v1.reserve(20);
vector<int>::iterator iter;
cout << v1.capacity() << endl;
cout << v1.size() << endl;
for(i = 0; i < 15; i++){
v1[i] = i;
}
cout << v1.capacity() << endl;
cout << v1.size() << endl;
for(iter = v1.begin(); iter != v1.end(); iter++){
cout << *iter << '\t';
}
cout << endl;
for (i = 0; i < 15; i++){
cout << v1[i] << '\t';
}
cout << endl;
return 0;
}
结果如下:
20
0
20
0
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
分析:在容器中没有实际元素时同过下标写入的数据可以存在内存中,因为可以通过下标再读出来,但是这种做法不被标准允许,因为size()一直都是0,而且通过迭代器去读写的时候,begin==end,应该算是越界访问写入的(感觉用越界这个词也不是很准确)。
问题修正:
1.改用push_back插入数据。
#include <iostream>
#include <vector>
using namespace std;
int main(){
unsigned int i;
vector<int> v1;
v1.reserve(20);
vector<int>::iterator iter;
cout << v1.capacity() << endl;
cout << v1.size() << endl;
for(i = 0; i < 15; i++){
v1.push_back(i);
}
cout << v1.capacity() << endl;
cout << v1.size() << endl;
for(iter = v1.begin(); iter != v1.end(); iter++){
cout << *iter << '\t';
}
cout << endl;
for (i = 0; i < 15; i++){
cout << v1[i] << '\t';
}
cout << endl;
return 0;
}
运行结果:size值正确,且通过迭代器可以读出来;
20
0
20
15
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
2.创建vector容器时,指定元素个数,初始化容器方法很多,不要创建空容器再去扩容就好了。
#include <iostream>
#include <vector>
using namespace std;
int main(){
unsigned int i;
vector<int> v1(20);
// v1.reserve(20);
vector<int>::iterator iter;
cout << v1.capacity() << endl;
cout << v1.size() << endl;
for(i = 0; i < 15; i++){
v1[i] = i;
}
cout << v1.capacity() << endl;
cout << v1.size() << endl;
for(iter = v1.begin(); iter != v1.end(); iter++){
cout << *iter << '\t';
}
cout << endl;
for (i = 0; i < 15; i++){
cout << v1[i] << '\t';
}
cout << endl;
return 0;
}
运行结果:结果size为20,且最后5个数字为0,说明指定个数初始化是往vector中放如了20个0。迭代器使用也正常。
20
20
20
20
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 0 0 0 0 0
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
总结:
vector中[]的使用只是针对已有的实际元素去读取或者修改,通过下标去写入有容量的空容器,编译不会检查错误,且可以写入,但是容器库识别不了这种做法,所以相应的size()值与begin()、end()返回的迭代器都不会变, 所以写入或修改元素最好还是用容器库提供的接口去操作更安全。
标签:20,迭代,int,v1,vector,下标,include,size From: https://blog.csdn.net/Il_l_Il/article/details/139857170