C++-----容器及应用(vector)
向量 vector? ? ? ? vector 是STL中最常用的容器,其特点是占用连续内存空间,对数据的随机访问支持的很好,既可以像数组那样被访问元素的下标来访问,也可以使用其提供的成员函数来at()来访问。向量是一个按照尾部开口设计的容器,因此在其尾部进行数据的输入和输出效率最高。向量定义于头文件 vector,命名于名字空间 std。 ? ? 1. 1 vector 对象的定义和初始化? ? ? ? ? vector 有多个构造函数,用户可以根据需要在程序中选择,常用的构造函数如下: 构造函数 作用 vector(); 创建一个没有任何元素的空向量 vector(vector&& _Right); 创建一个向量并且用向量_Right初始化该向量 vector(size_type Count ); 创建一个大小为Count的向量 voctor(size_type _Count,const Type& _val) 创建一个大小为_Count的向量,该向量所有元素初始化为_val template vector(InputIterator _First,InputIterator _Last); 创建一个向量,并以迭代器_First和_Last之间的元素初始化该向量 ? ? ? ? ?另外,vector重载了运算符operator=,可以以复制的方式在两个vector对象之间复制数据。 ? ? ? ? 范例:测试上表中的构造函数 ? ? ? ?? #include #include using namespace std; int main() { vector //创建一个长度为3初始值为0的int型向量 vector cout<<"v1="; for(v1_Iter=v1.begin();v1_Iter!=v1.end();v1_Iter++) cout<<""<<*v1_Iter< //创建一个长度为5初始值为2的int型向量 vector cout<<"v2="; for(v2_Iter=v2.begin();v2_Iter!=v2.end();v2_Iter++) cout<<""<<*v2_Iter< //创建一个int型向量并用v2初始化它 vector cout<<"v3="; for(v3_Iter=v3.begin();v3_Iter!=v3.end();v3_Iter++) cout<<""<<*v3_Iter< //创建一个int型向量并用v2 的一部分初始化它 vector cout<<"v4="; for(v4_Iter=v4.begin();v4_Iter!=v4.end();v4_Iter++) cout<<""<<*v4_Iter< return 0; } ? ? ? ? 输出结果如下图: ? ? ? ? ? ? ? ? ? 对于数据的读取,vector主要提供了如下表的成员函数,注意向量中第一个元素的位置为0: 访问表达式 说明 reference front(); const_referrence front() const; 返回第一个元素 reference back(); const_reference back() const; 返回最后一个元素 ? ? ? ? 下表给出vector提供的删除、插入、等用于改变元素只能的成员函数。成员函数后加const的意思是常量成员函数。也就是这个成员函数不会修改该类的任何成员数据。 ? ? ? ?? 成员函数 说明 reference operator[](size_type Pos); const_reference operator[](size_type Pos) const; 返回由Pos指定位置上的元素 reference at(size_type Pos); const_reference at(size_type Pos) const; 返回由Pos指定位置上的元素 clear(); 从容器中删除所有元素。 erase(position); 删除由position指定的元素 erase(beg,end); 删除从beg到end-1之间所有的元素 insert(position,elem); 将elem的一个拷贝插入由position的位置 insert(position,n,elem); 将elem的n个拷贝插入由position的位置 insert(position,beg,end); 将从beg到end-1的所有元素的拷贝插入position指定位置 push_back(elem); 将elem的一个拷贝插入vector的末尾 pop_back(); 删除最后元素 resize(num); 将元素的个数改为num,如果size()增加,由默认构造函数负责创建这些元素 resize(num,elem); 将元素的个数改为num,如果size()增加,由默认构造函数将这些元素初始化为elem。 ? ? ? ? 范例:编写一个程序,在程序中使用一个可以存放整型(int)的vector对象,并在尾部逐次压入103,765,208,435数据,然后再完成以下工作。 ? ? ? ? (1)分别使用函数at()和下标法在显示器上显示向量内容。 ? ? ? ? (2)使用下标法为向量中,每一个元素乘以2后会送个数据 ? ? ? ? (3)使用at(),每一个元素乘以2后会送个数据。 ? ? ? ? (4)使用迭代器遍历并显示。 ? ? ? ? (5)使用迭代器定位在向量中第3个数据位置插入88.代码如下: ? ? ? ? ? #include #include using namespace std; int main() { //定义存放int的vector vector int i; //尾部压入4个数 intvector.push_back(103); intvector.push_back(765); intvector.push_back(208); intvector.push_back(435); //使用下标读取 cout<<"第一行数据:"; for(i=0;i<4;i++) cout< cout< //使用at读取 cout<<"第二行数据:"; for(i=0;i<4;i++) cout< cout< //使用下标写数据 for(i=0;i<4;i++) intvector[i]*=2; cout<<"第三行数据:"; for(i=0;i<4;i++) cout< cout< //使用at()写数据 for(i=0;i<4;i++) intvector.at(i)*=2; cout<<"第四行数据:"; for(i=0;i<4;i++) cout< cout< //定义迭代器 vector //使用迭代器读取数据 cout<<"第五行数据:"; for(vectorIt=intvector.begin();vectorIt!=intvector.end();vectorIt++) cout<<*vectorIt<<" "; cout< //使用迭代器插入数据 vectorIt=intvector.begin(); ++vectorIt; ++vectorIt; intvector.insert(vectorIt,88); //使用迭代器输出数据 cout<<"第六行数据:"; for(vectorIt=intvector.begin();vectorIt!=intvector.end();vectorIt++) cout<<*vectorIt<<" "; cout< return 0; } ? ? ? ? 运行结果如下: ? ? ? ?? ? ? ? ? C++11新增的内容,列表初始化和范围for。 ? ? ? ?? #include #include using namespace std; int main() { //创建一个int 向量v1,使用列表初始化 vector //输出 cout << "v1="; for (auto i : v1) cout << " " << i; cout << endl; //创建v2 vector //输出 cout << "v2="; for (auto i : v2) cout << " " << i; cout << endl; v1 = { 8,99,34,21,67 }; //输出 cout << "v1="; for (auto i : v1) cout << " " << i; cout << endl; // for (auto &i : v1) i = 2 * i; for (auto &i : v1) cout << " " << i; cout << endl; return 0; } ? ? ? ? 在使用g++进行编译时需要将其设置为支持c++11。 ? ? ? ?? ? ? ? ?? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |