STL容器

STL容器 vector容器1.vector容器简介vector是将元素置于一个动态数序中加以管理的容器。可以与数组类比vector可以随机存取元素vector可以高效在尾部添加或移除元素在中部或头部则要耗费时间。可以用下标访问vector容器语法为vector变量名[下标]或用at成员函数语法为vector 变量名.at(下标)。2.vector对象的构造vector采用模板类实现代码演示#includeiostream using namespace std; #include vector class T { }; int main() { vectorint vecint; //存放int变量vector容器 vectorstring vecstring; //存放string类vector容器 vectorT* vecpT; //存放对象T指针vector容器 vectorT vecT; //存放对象T变量的vector容器 //由于容器元素的存放是按值复制的方式进行所以此时T必须提供T的 //拷贝构造函数以保证对象T间的拷贝正常。 }3.vector对象的带参数构造vector (beg,end);构造函数将[beg,end)区间中的元素拷贝给本身注意拷贝区间是左闭右开。实现效果vector(n,num); 构造函数将n个num拷贝给本身。实现效果vector(const vector vec);拷贝构造函数。实现效果4.vector的赋值利用assign函数进行赋值vectorint vecIntA int iArray[]{ 0,1,2,3,4 } vecIntA.assign(iArray, iArray 5); //将数组iArray数组[iArray到iArray5的元素拷贝到vecIntA for (int i 0; i vecIntA.size(); i) { cout vecIntA[i] endl; }打印结果用assign函数拷贝内容时如果vector容器中本身存有元素则新复制的内容会将其覆盖掉vector容器中将仅存在最近拷贝进去的内容。利用assign将其他容器内容复制到另一容器中int iArray[]{ 0,1,2,3,4 }; vecIntA.assign(iArray, iArray 5); //将数组iArray数组[iArray到iArray5的元素拷贝到vecIntA for (int i 0; i vecIntA.size(); i) { cout vecIntA[i] ; } cout endl; //将vecIntA中所有元素赋值给vecIntB vecIntB.assign(vecIntA.begin(), vecIntA.end()); //begin()指向容器中的下标0元素end()指向容器中最后一个元素的下一元素 for (int i 0; i vecIntB.size(); i) { cout vecIntB[i] endl; } cout endl;打印结果利用 vecIntBvecIntA 也可达到此效果。5.vector的大小vector.size(); 返回容器中元素的个数vector.empty(); 返回bool类型判断容器是否为空1为空0为非空。vector.resize(num); 重新指定容器的长度为num若容器变长则以默认值填充新位置若容器变短则末尾超出容器长度的元素被删除。容器缩短效果/容器增长效果人为设置缺省值6.vetor元素的访问方式上文提到过可以用下标法来访问vector容器内的元素但是这样可能造成访问越界。可以使用at()函数例如vec.at(idx);返回索引(下标)所指的数据如果idx越界抛出out_of_range异常。vs编译器会直接终端报错。7.vector的插入在vector末尾进行添加或移除操作vector int vec; vec.push_back(num); //在容器尾部加入一个元素num为插入的元素代码实现int main() { vectorint vec; int a[]{ 1,2,3,4,5 }; vec.assign(a, a 5); vec.push_back(9); //在容器末尾插入9 for (int i 0; i vec.size(); i) { cout vec[i] ; } }打印结果vector int vec; vec.pop_back(); //在容器尾部删除一个元素代码实现int main() { vectorint vec; int a[]{ 1,2,3,4,5 }; vec.assign(a, a 5); vec.push_back(9); //在容器末尾插入9 for (int i 0; i vec.size(); i) { cout vec[i] ; } cout endl; vec.pop_back(); for (int i 0; i vec.size(); i) { cout vec[i] ; } }打印结果在vector中间进行插入删除操作利用被重载的insert函数1.在pos位置插入一个elem元素的拷贝vector int vec; vec.insert(pos,elem); //在pos位置插入一个elem元素的拷贝。代码实现//在指定的位置插入一个指定元素(在下标为3处插入100 vec.insert(vec.begin() 3, 100); //注意第一个参数不能为下标应该为指针 cout endl; for (int i 0; i vec.size(); i) { cout vec[i] ; }打印结果2.在pos位置插入n个elem数据vector int vec; vec.insert(pos,n,elem); //在pos位置插入n个elem数据无返回值。代码实现//在指定位置插入多个元素在下表为3处插入3个1000 vec.insert(vec.begin() 3, 3, 1000); cout endl; for (int i 0; i vec.size(); i) { cout vec[i] ; }打印结果3.在pos位置插入[beg,end)区间的数据,beg与end是指针vector int vec vec.insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据代码实现//将指定区间中的元素插入到指定的位置(在下标为7处插入50607080) int b[]{ 40,50,60,70,80,90 }; vec.insert(vec.begin() 7, b 1, b 5); //如果要插入其他容器的一段内容则后面两个参数改成用v1.begin()偏移量。 cout endl; for (int i 0; i vec.size(); i) { cout vec[i] ; }打印结果8.迭代器的概念什么是迭代器迭代器是一种检查容器内元素并且遍历容器内元素的数据类型。迭代器的作用迭代器提供对一个容器中的对象的访问方法并且定义了容器中对象的范围可以改善访问越界的问题。为什么需要迭代器STL提供的每种容器的实现原理各不相同。如果没有迭代器我们需要记住每一种容器中对象的访问方法很显然这样会变得非常麻烦。每个容器中都实现了一个选代器用于对容器中对象的访问。虽然每个容器中迭代器的实现方式不一样但是对于用户来说操作方法是一致的也就是说通过迭代器统一了对所有容器的访问方式。例如无论哪个容器访问当前元素的下一个元素我们可以通过迭代器自增进行访问。迭代器是为了提高编程效率而开发的。9.vector容器的迭代器容器里面的迭代器大部分是一个类中类嵌套类我们把这个类的名字叫做iterator。//构造一个迭代器对象 vector int::iterator it; //it是一个迭代器对象iterator中实现了一些方法可以用于对容器中元素的访问。其中两个代表函数是begin()和end()。begin()函数返回指向容器中第一个元素的迭代器end()函数返回指向容器中最后一个元素后一个位置的迭代器。begin函数和end函数每种容器都定义了一对命名为begin和end的函数用于返回迭代器。如果容器中有元素的话由begin返回的元素指向第一个元素。vector int vec; vectorint::iterator it; itvec.begin(); //若v不为空,iter指向vec[0]由end返回的选代器指向最后一个元素的下一个位置。若vec为空begin和end返回相同。遍历容器int main() { vector int vec; int a[]{ 100,1,20,30,40 }; vec.assign(a, a 5); //构造一个迭代器对象 vector int::iterator it; //it是一个迭代器对象 //让迭代器it指向vec中的第一个元素 it vec.begin(); //通过循环的方式使用迭代器遍历vec中的所有元素 for (it vec.begin(); it ! vec.end(); it) { cout *it ; } }打印效果解释 1.it作为迭代器能通过或--操作遍历容器元素本质是因为迭代器类或类型重载了运算符函数。2.这里用“*it”来访问容器内元素而能用*访问迭代器指向的内容是因为迭代器重载了解引用运算符。vector容器的迭代器属于“随机访问迭代器”迭代器一次可以移动多个位置。接上部分代码it vec.begin(); //重新让it指向容器首元素 it it 2; cout *itendl;打印效果