vector向量
向量(vector 容器类):
#include <vector> ,vector 是一个能够存放任意类型的动态数组,是基本数组的类模板(连续存储)。但是一个容器中的所有对象都必须是同一种类型的。
内部实现: 数组
vector <T, Alloc>
可以随机存取数据(用索引直接存取)。
向量尾部添加或删除数据,耗时O(1)。但是在中部或头部插入或删除数据需要移动后面数据,耗时O(N)。
在STL中,标准库的全部成员在预先定义的命名空间std中。如果要用类模板vector :#include <vector> using namespace std;
vector 类中定义了5 种构造函数:
1. vector<int> v1 ;
默认构造函数,构造一个初始长度为0 的空向量,如:
2. vector<int> v2(5);
定义了5个,值默认为0
3. vector<int> v3(n,3);
定义了n个,值为3的整数
4. vector<int> v4(v3) ;
复制构造函数,构造一个新的向量,作为已存在的向量的完全复制
5. vector<int> v5(first,last)
产生初始值为一个区间的向量。区间由一个 半开区间[ first,last ) 来指定。vector<int> vec1; // vec1对象初始化为空 vector<int> vec2(10,6); // vec2初始化为10个值为6的元素 vector<int> vec3(vec2.begin(), vec2.begin()+3); // 用vec2[0]到vec[2]共3个数来初始化vec3 vector<int> vec3(vec2.begin(), vec2.end()); // 相当于复制构造</span>
vector<int>::iterator i; // 声明迭代器,要有容器名和数据类型 for(i=vec2.begin(); i!=vec2.end(); i++) cout<<*i<<" "; cout<<endl; // 用迭代器遍历向量,并输出 迭代器类似于指针</span>
因为内部实现是数组,也可以这样输出:vec2[0],输出第一个值,和整型数组一样,首元素的下标为0.
赋值:vec2[3] = 5;这样初始化也行:
int a[] = {4, 1, 1, 1, 1, 1, 0, 5, 1, 0}; multiset<int> A; A.insert(a, a + 10);
vec1.insert(vec1.begin() + 1, 5); // 位置常用vec1.begin() + i来指定(迭代器)
主要成员函数:
push_back(elem) 在尾部加入一个数据elem。
pop_back() 删除最后一个数据。
erase(pos) 删除pos位置的数据,返回下一个数据的位置。
insert(pos,cnt,elem) 在pos位置插入cnt个数据elem。
begin() 返回的指针指向数组中的第一个数据。
end() 实际上是取末尾加一,以便让循环正确运行--它返回的指针指向最靠近数组界限的数据。
size() 返回容器中实际数据的个数。
empty() 判断容器是否为空。
clear() 移除容器中所有数据。
operator[] 返回容器中指定位置的一个引用
以下函数摘自百度百科:
c.assign(beg,end) c.assign(n,elem) 将(beg; end)区间中的数据赋值给c。将n个elem的拷贝赋值给c。
传回索引idx所指的数据,如果idx越界,抛出out_of_range。
c.back() 传回最后一个数据,不检查这个数据是否存在。
c.begin() 传回迭代器中的第一个数据地址。
c.capacity() 返回容器当前已分配的容量。
c.clear() 移除容器中所有数据。
c.empty() 判断容器是否为空。
c.end() 指向迭代器中末端元素的下一个,指向一个不存在元素。
c.erase(pos) 删除pos位置的数据,传回下一个数据的位置。
c.erase(beg,end) 删除[beg,end)区间的数据,传回下一个数据的位置。
c.front() 传回第一个数据。
get_allocator 使用构造函数返回一个拷贝。
c.insert(pos,elem) 在pos位置插入一个elem拷贝,传回新数据位置
c.insert(pos,n,elem) 在pos位置插入n个elem数据,无返回值
c.insert(pos,beg,end) 在pos位置插入在[beg,end)区间的数据。无返回值
c.max_size() 返回容器中最大数据的数量。
c.pop_back() 删除最后一个数据。
c.push_back(elem) 在尾部加入一个数据。
c.rbegin() 传回一个逆向队列的第一个数据。
c.rend() 传回一个逆向队列的最后一个数据的下一个位置。
c.resize(num) 重新指定队列的长度。
c.reserve() 保留适当的容量。
c.size() 返回容器中实际数据的个数。
c1.swap(c2) 将c1和c2元素互换
swap(c1,c2) 同上操作。
实例:
#include <iostream> #include <vector> #include <deque> using namespace std; int main() { // 定义各向量和声明迭代器 vector<int> vec1; // vec1对象初始化为空 vector<int> vec2(10,6); // vec2初始化为10个值为6的元素 vector<int> vec3(vec2.begin(), vec2.begin()+3); // vec3 对象最初有3个值为6的元素, vector<int>::iterator i; // 声明一个整型的迭代器 // 分别输出各向量 cout<<"输出vec1"<<endl; for(i=vec1.begin(); i!=vec1.end(); ++i) cout<<*i<<" "; cout<<endl; // 用迭代器遍历向量,输出迭代器所指向的值*i cout<<"输出vec2"<<endl; for(i=vec2.begin(); i!=vec2.end(); i++) cout<<*i<<" "; cout<<endl; cout<<"输出vec3"<<endl; for(i=vec3.begin(); i!=vec3.end(); ++i) cout<<*i<<" "; cout<<endl; cout<<vec3[2]<<endl; // 测试添加和插入成员函数,vector 不支持从前插入 vec1.push_back(2); // 从后面添加一个成员 vec1.push_back(4); vec1.insert(vec1.begin() + 1, 5); // 在vec1第一个元素的位置上插入成员5 注意:数组都是从第零个元素开始的 vec1.insert(vec1.begin() + 1, vec3.begin(), vec3.end()); // 从vec1第一个元素的位置开始插入vec3 的所有成员 cout << "after push() and insert() now the vec1 is:" << endl; for (i = vec1.begin(); i != vec1.end(); ++i) cout << *i << " "; cout << endl; // 测试赋值成员函数 vec2.assign(8, 1); // 重新给vec2 赋值,8 个成员的初始值都为1 cout << "vec2.assign(8,1):" << endl; for (i = vec2.begin(); i != vec2.end(); ++i) cout << *i << " "; cout << endl; // 测试引用类函数 cout << "vec1.front()=" << vec1.front() << endl; // vec1 第零个成员 cout << "vec1.back()=" << vec1.back() << endl; // vec1 的最后一个成员 cout << "vec1.at(4)=" << vec1.at(4) << endl; // vec1 的第五个成员 cout << "vec1[4]=" << vec1[4] << endl; // vec1 的第五个成员 // 测试移出和删除 vec1.pop_back(); // 将最后一个成员移出vec1 vec1.erase(vec1.begin() + 1, vec1.end() - 2); // 删除成员, cout << "vec1.pop_back() and vec1.erase():" << endl; for (i = vec1.begin(); i != vec1.end(); ++i) cout << *i << " "; cout << endl; // 显示序列的状态信息 cout << "vec1.size(): " << vec1.size() << endl; // 打印成员个数 cout << "vec1.empty(): " << vec1.empty() << endl; // 清空 vector<int> vec4(5); for(int j=0; j<5; j++) cout<<vec4[j]<<endl; getchar(); // 使输出窗口,暂停住,等待键盘输入才消失。 从而能看到输出 return 0; }
运行效果:
向量(vector)
最新推荐文章于 2023-12-02 23:57:18 发布