在编程题中,遇到输入要求多行数据时,之前是采用二维数组保存数组,但是空间的开辟总是未知的,或多或少也不合适。数组的越界问题会导致程序的奔溃,而且数组的动态性不好。
vector内存的特点是可变大小的,尾部插入删除元素的效率还是很高的。
顺便一提,迭代器的失效问题:
在向容器添加元素后:
- 如果是vector或string,插入元素且存储空间被重新分配,则指向容器的迭代器、指针和引用都会失效;如果存储空间未重新分配,指向插入位置之前的迭代器、指针和引用仍有效,插入之后元素的迭代器、指针和引用将会失效。
- 对于deque,如果在首尾位置添加元素,迭代器会失效,但指向元素的引用和指针不会失效;在首尾位置之外插入,都会导致迭代器、指针和引用失效。
- 对于list和forward_list,指向容器的迭代器、指针和引用仍有效。
从容器中删除一个元素后,被删除元素的迭代器、指针和引用会失效,而对于其他元素:
- 对于list和forward_list,指向容器其他位置的迭代器、指针和引用仍有效。
- 对于deque,如果在首尾之外的任何位置删除元素,其他元素的迭代器、指针和引用会失效。如果删除deque的尾元素,尾后迭代器会失效,其他不受影响;如果删除首元素,同样也不受影响。
- 对于vector和string,删除元素之后的迭代器总会失效;被删元素之前的迭代器、引用和指针仍有效。
在使用时,遇到了这样的问题:
vector< vector<int> > vecT;
int i;
for(i=0; i<T; i++)
{
cin>>n;
vecT.resize(n);
for(j=0; j<n; j++)
{
cin>>A;
vecT[i].push_back(A);
}
}
当对vector操作时,编译器会报出错误,下标访问出错。
你可以这样定义一个模板,
vector< vector<int> > vec(4); //在一些旧的编译器上要注意> 和 > 之间的空格,容易理解为>>操作符出错
这也就关键,vec可以保存4个向量,向量的长度是可以改变的。vec[i]返回的是第i个向量。同理,vec[i][j]返回的是第i个向量中的第j个元素。
在使用前,需要多加几个步骤,指定向量的大小,如下:
for(int i=0;i<3;i++)
vec[i].resize(3);
这样,你就定义了一个3X3的数组了(另一个3在 申明时定义的)。而且你可以随时改变它的大小。
int m;
cin>>m;
vector< vector<int> > vec(m);
for(int i=0; i<3; i++)
{
vec[i].resize(4);
}
vec[1][2] = 1;
当然,还可以使用下边这种方法:
vector< vector<int> > vec2;
vector<int> vec1;
int i,j;
for(i=0;i<10;++i){
vec1.clear();
for(j=0;j<10;++j)
{
vec1.push_back(i*10+j);
}
vec2.push_back(vec1);
}
for(i=0;i<10;++i){
for(j=0;j<10;++j)
cout<<vec2[i][j]<<' ';
cout<<endl;
}