向量(vector)

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。将nelem的拷贝赋值给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位置插入nelem数据,无返回值
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)             c1c2元素互换
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;
}

运行效果:
















  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值