/*************************************** *Vector总结 *vector模塑出一个动态数组,因此,它本身是“将元素至于动态数组中加以管理” *的一个抽象的概念。 * *1.使用前需要包含头文件*2.Vector将其元素复制到内部的dynamic array中。 元素之间总是存在某种顺序,所以vector是一种有序群集(ordered collec)。 vector支持随机存取,因此只要知道位置,你可以在常数时间内存取任何一个元素。 vector的迭代器是随机存取迭代器,所以对任何一个STL算法都可以奏效。 *个人理解:vector是在末端插入 或者 删除元素,可以说相当于一个栈吧。 *vector中用于操作大小的函数 size(); empty(); max_size(); capacity();(返回vector实际能容纳的元素数量,如果超过这个数量,vector就有必要重新配置内部存储器) A.一旦内存重新配置,和vector元素相关的所有reference、pointers、iterators都会失效 B.内存重新配置很耗时间 所以如果你的程序管理了和vector元素相关的reference、pointers、iterators, 或者如果执行速度对你而言至关重要,那么就必须考虑容量问题。 *避免重新配置内存的方法 可以用 reserve()保留适当的容量 std::vector */ /********************************* Vector实例 *********************************/ #includev; v.reserve(80); 另一种避免重新配置内存的方法是,初始化期间就向构造函数传递附加参数,构造出足够的空间, 如果是ACM的话,一般是这样用的。 std::vector v(5); vector不能使用reserve()来所见容量,这一点于string不同。 *构造,拷贝和解构 vector c 产生一个空vector,其中没有任何元素 vector c1(c2) 产生另一个同型vector的副本(所有元素都被拷贝) vector c(n) 利用元素的default构造函数生成一个大小为n的vector vector c(n,elem) 产生一个大小为n的vector,每个元素值都是elem vector c(beg,end) 产生一个vector,以区间[beg;end]作为元素初值 c.~vector () 销毁所有元素,并释放内存 *非变动性操作(Nonmodifying Operation) c.size(); c.empty() c,max_size(); capacity(); reserve(); //并非完全意义上的非变动 c1 == c2; c1 != c2 c1 < c2; c1 > c2; c1 <= c2; c1 >= c2; *赋值(Assignments) c1 = c2 将c2的全部元素赋值给c1 c.assign(n,elem) 复制n个elem,赋值给c c.assign(beg,end) c1.swap(c2) swap(c1,c2) *元素存取(Element Access) c.at(idx) 返回索引idx所标识的元素。如果idx越界抛出out_of_range c[idx] 返回索引idx所表示的元素,不进行范围检查 //个人觉得就是把vector当作一个数组来用了 c.front() 返回第一个元素,不检查第一个元素是否存在 c.back() 返回最后一个元素,不检查最后一个元素是否存在 //对于调用者来说,最重要的事情莫过于搞清楚这些操作是否进行范围检查。 //只有at()会这么做 //对一个vector调用operation[],front(),back(),都会引发未定义行为。 *迭代器相关函数(Iterator Function) vector提供了一些常规函数来获取迭代器。(通常就是一个指针) c.begin(); 返回一个随机存取迭代器,指向第一个元素 c.end(); 返回一个随机存储迭代器,指向最后一个元素的一下个位置 c.rbegin(); 返回一个逆向迭代器,指向逆向迭代的第一个元素 c.rend(); *安插(insert) 和 移除(remove)元素 c.insert(pos,elem) 在pos位置上插入一个elem副本,并返回元素位置 c.insert(pos,n,elem) 在pos位置上插入n个elem副本。无回传值 c.insert(pos,beg,end) 在pos位置上插入区间[beg;end]内的所有元素的副本,无回传值 c.push_back(elem) 在尾部添加一个elem副本 c.pop_back() 移除最后一个元素(但不回传) c.erase(pos) 移除pos位置上的元素,返回下一个元素的位置 c.erase(beg,end) c.resize(num) 将元素数量改为num(如果size()变大了,多出来的新元素都以default构造函数来完成) c.resize(num,elem) c.clear() 移除所有元素,将容器清空 *将Vector当作一般Arrays使用 std::vector v; v.resize(41); strcpy(&v[0],"hello, world!"); printf("%s\n",&v[0]); //千万不要把迭代器当作第一元素的地址来传递。vector迭代器是由实作版本定义的,也许并不是一个一般指针 //当然一般情况下是。。。 printf("%s\n",&v[0]);//OK printf("%s\n",v.begin());//ERROR *异常处理(Exception Handling) *************************************************************** #include #include using namespace std; void Print_Element(vector <string> Object); vector<string>::iterator Find(vector<string>::iterator Begin,vector<string>::iterator End,char* szTemp); void main() { vector <string> Object; Object.reserve(5); Object.push_back("Hello, "); Object.push_back("How"); Object.push_back("are"); Object.push_back("you"); Object.push_back("?"); // copy(Object.begin(),Object.end, // ostream_iterator (cout," ")); Print_Element(Object); cout<endl; cout< endl; cout< endl; swap(Object[1],Object[3]); //Print_Element(Object); // Object.insert(find(Object.begin(),Object.end(),"?"),"always"); if (Find(Object.begin(),Object.end(),"?")!=NULL) //如果查找成功 我返回一个迭代器 否则返回NULL { Object.insert(Find(Object.begin(),Object.end(),"?"),"always"); } // Object.insert(Find(Object.begin(),Object.end(),"?")!=NULL,"always"); Print_Element(Object); Object.back() = "!"; //更改最后一个string Print_Element(Object); Object.front() = "xxx"; Print_Element(Object); cout< endl; cout< endl; cout< endl; //容量不足时,扩充一倍 } vector<string>::iterator Find(vector<string>::iterator Begin,vector<string>::iterator End,char* szTemp) { vector<string>::iterator pos; pos = Begin; for (pos;pos!=End;pos++) { if (pos->compare(szTemp)==0) { return pos; } } return NULL; } void Print_Element(vector <string> Object) { vector <string>::iterator it; it = Object.begin(); for (;it!=Object.end();it++) { // cout<<*it< cout< data()<<" "; } cout<<endl; }
/*********************************************************************** 实例2 ***********************************************************************/ #include#include using namespace std; void Print_Element(vector<int> Object); int main() { int i = 0; vector <int> Object(5,2); cout<<"Object.size(): "< endl; cout<<"Object.capacity(): "< endl; cout<<"Object.max_size(): "< endl; Object.reserve(10); cout<<"After reserve(10)"< endl; cout<<"Object.size(): "< endl; cout<<"Object.capacity(): "< endl; cout<<"Push Data:"<<endl; for(i=0;i<5;i++) { Object.push_back(i); } Print_Element(Object); cout<<"Object.size(): "< endl; cout<<"Object.capacity(): "< endl; swap(Object[0],Object[8]); cout<<"After swap(Object[0],Object[8]) :"<<endl; Print_Element(Object); for(i=0;i<5;i++) { Object.pop_back(); } cout<<"After Pop Data :"< endl; Print_Element(Object); int front = Object.front(); int back = Object.back(); cout<<"front:"< endl; cout<<"back:"< endl; cout<<"After Object.assign(3,10): "<<endl; Object.assign(3,10); Print_Element(Object); vector <int> One(Object); cout< "After vector One(Object): "<<endl; Print_Element(One); cout<"cout<]< endl; Object.resize(10,100); cout<<"After Object.resize(10,100): "<<endl; Print_Element(Object); vector <int>::iterator pos; pos = Object.begin(); cout<<"After Object.insert(pos,99): "<<endl; Object.insert(pos,99); Print_Element(Object); cout< "Object.size(): "< endl; cout<<"Object.capacity(): "< endl; //这里由于插入了一个新的元素,所以vector的容量不够用了, //进而导致了vector重新配置内存, //所以iterator失效了,不加上下面的 pos = Object.begin(),程序会奔溃的 // pos = Object.begin(); //必须有这句,相当于手动重置pos Object.erase(pos); cout< "After Object.erase(pos): "<<endl; Print_Element(Object); return 0; } void Print_Element(vector<int> Object) { vector<int>::iterator it; it = Object.begin(); for(;it ) { cout<<*it<<ends; } cout<<endl; }