vector之reserve和resize ,ersae和remove
1. vector 的reserve增加了vector的capacity,但是它的size没有改变!而resize改变了vector的capacity同时也增加了它的size。
reserve是容器预留空间,但在空间内不真正创建元素对象,所以在没有添加新的对象之前,不能引用容器内的元素。加入新的元素时,要调用push_back()/insert()函数。
resize是改变容器的大小,且在创建对象,因此,调用这个函数之后,就可以引用容器内的对象了,因此当加入新的元素时,用operator[]操作符,或者用迭代器来引用元素对象。此时再调用push_back()函数,是加在这个新的空间后面的。
int main(int argc, char* argv[]) { vector<int> vect; vect.push_back(1); vect.push_back(2); vect.push_back(3); vect.push_back(4); vect.reserve(100); cout<<vect.size()<<endl; cout<<vect.capacity()<<endl;//size为4,但是capacity为100 int i = 0; for (i = 0; i < 4; i++)//新元素还没有构造, 此时不能用[]访问元素第五个及以后的元素 { cout<<vect[i]<<endl; } return 0; }
int main(int argc, char* argv[]) { vector<int> vect; vect.push_back(1); vect.push_back(2); vect.push_back(3); vect.push_back(4); vect.resize(100); //新的空间不覆盖原有四个元素占有的空间 cout<<vect.size()<<endl; cout<<vect.capacity()<<endl;//size和capacity都是100 int i = 0; for (i = 0; i < 100; i++) //可以用operator[]操作符访问后面的元素 { cout<<vect[i]<<endl; } return 0; }
int main(int argc, char* argv[]) { vector<int> vect; vect.resize(100); //分配100个空间 vect.push_back(1); //在100个后面接着分配 vect.push_back(2); vect.push_back(3); vect.push_back(4); cout<<vect.size()<<endl; cout<<vect.capacity()<<endl;//现在size和capacity都是104 int i = 0; for (i = 0; i < 104; i++) { cout<<vect[i]<<endl; } return 0; }
2. erase()返回值是一个迭代器,指向删除元素下一个元素;如果是删除某范围内的元素时:返回值也表示一个迭代器,指向最后一个删除元素的下一个元素.
for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); iter++) { if( *iter == 3) iter = veci.erase(iter); }
这样无法删除连续两个3.
需要写成:
for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); ) { if( *iter == 3) iter = veci.erase(iter); else iter ++ ; }
remove()只是将待删除元素之后的元素移动到vector的前端,而不是删除。若要真正移除,需要搭配使用erase()。
#include <iostream> #include <vector> #include <algorithm> #include <functional> using namespace std; int main() { typedef vector<int > IntVector ; //Define an iterator for template class vector of integer typedef IntVector::iterator IntVectorIt ; IntVector Numbers(8) ; //vector containing numbers IntVectorIt start, end, it, last; start = Numbers.begin() ; // location of first // element of Numbers end = Numbers.end() ; // one past the location // last element of Numbers //Initialize vector Numbers Numbers[0] = 10 ; Numbers[1] = 20 ; Numbers[2] = 10 ; Numbers[3] = 15 ; Numbers[4] = 12 ; Numbers[5] = 7 ; Numbers[6] = 9 ; Numbers[7] = 11 ; cout << "Before calling remove" << endl ; cout << "Numbers { " ; for(it = start; it != end; it++) cout << *it << " " ; cout << " }\n" << endl ; // 输出为10 20 10 15 12 7 9 11 若Numbers[7] = 10,输出为10 20 10 15 12 7 9 10 // remove all elements from Numbers that match 10 last = remove(start, end, 10) ; cout << "After calling remove" << endl ; cout << "Numbers { " ; for(it = start; it != end; it++) cout << *it << " " ; cout << " }\n" << endl ; //20 15 12 7 9 11 9 11(删掉后的元素前移,删掉几位在在末尾显示内存中用未移动的末几位)若Number[7] = 10,输出为20 15 12 7 9 7 9 10 //print number of elements removed from Numbers cout << "Total number of elements removed from Numbers = " << end - last << endl ; //为2,若Number[7]= 10,为3 //print only the valid elements of Number cout << "Valid elements of Numbers { " ; for(it = start; it != last; it++) cout << *it << " " ; cout << " }\n" << endl ; //20 15 12 7 9 11,若Number[7]= 10,输出20 15 12 7 9,此时Numbers的大小还是8.
}
remove()需要和erase()配合使用,如erase(remove(svec.begin(),svec.end(),"be"), svec.end());
这句的意思是,取得"be"的位置(位于结尾),然后删除"be"到原vector结尾的所有元素。