vector容器使用方法

/*
vector<T> v; //采用模板实现类实现,默认构造函数
vector<T> s(v.begin(), end());//将v[begin(), end]区间的元素拷贝给本身
vector<T> v(n, elem);//构造函数将n个elem拷贝给本身
vector<T> v(const vector &vec);




assign(v.begin(), v.end());//将[begin, end]区间中的数据拷贝赋值给本身
assign(n, elem);//将n个elem拷贝赋值给本身
vector& operator= (const vector &vec);//重载等号操作符
swap(vec);//将vec与本身的元素互换


第一个赋值函数,可以这么写
int arr[] = {0, 1, 2, 3, 4};
assign(arr, arr + 5);//使用数组初始化vector


size();//返回容器中元素的个数
empty();//判断容器是否为空 如果为空返回true,否则返回false
resize(int num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置,如果容器变短,则末尾超出容器长度的元素被删除。
resize(int num, elem);//重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
capacity()//容器的容量
reserve(int len);//容器预留len个元素的长度,预留位置不初始化,元素不可访问。


at(int idx);//返回索引idx所指的数据,如果idx越界,抛出
out_of_range异常。
operator[];//返回索引idx所指的数据,越界时,运行直接报错
front();//返回容器中第一个数据元素
back();//返回容器中最后一个数据元素


insert(const_iterator pos, int count, ele);//迭代器指向位置pos插入count个元素ele
push_back(ele);//尾部插入元素ele
pop_back();//删除最后一个元素
erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素
erase(const_iterator pos);//删除迭代器指向的元素
clear();//删除容器中所有元素


reserve 和resize的区别
答: reserve是容器预留空间,但在空间内不真正创建元素对象,
所以在没有添加新的对象之前,不能引用容器内的元素.
resize是改变容器的大小,且在创建对象,因此,要调用这个函数之后,就可以引用容器内的对象了。
*/


# include <iostream>
# include <vector>


using namespace std;


void printVector(vector<int> v)
{
//end() = 后一个加1
// iterator是迭代器种类
for(vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}


//初始化
void test01()
{
vector<int> v1;//默认构造
int arr[] = {10, 20, 30, 40};
vector<int> v2(arr, arr + sizeof(arr)/sizeof(int));
vector<int> v3(v2.begin(), v2.end());
vector<int> v4(v3);


printVector(v2);
printVector(v3);
printVector(v4);

}


//常用赋值操作
void test02()
{
int arr[] = {10, 20, 30, 40};
vector<int> v1(arr, arr + sizeof(arr)/sizeof(int));//默认构造函数
printVector(v1);
cout << "---------" << endl;
vector<int> v2;
v2.assign(v1.begin(), v1.end());
printVector(v2);
cout << "---------" << endl;
//重载=
vector<int> v3;
v3 = v2;
printVector(v3);
cout << "-----------" << endl;
int arr1[] = {100, 200, 300, 400};
vector<int> v4(arr1, arr1 + sizeof(arr)/sizeof(int));//默认构造
printVector(v4);
cout << "--------" << endl;
v4.swap(v1);//交换
printVector(v4);
cout << "---------" << endl;
printVector(v1);
}


//vector大操作
void test03()
{
int arr[] = {10, 20, 30, 40};
vector<int> v1(arr, arr + sizeof(arr)/sizeof(int));


cout << "size: " << v1.size() << endl;

if(v1.empty() == true)
{
cout << "空" << endl;
}
else
{
cout << "不空" << endl;
}
printVector(v1);
v1.resize(2);
printVector(v1);
v1.resize(6);
printVector(v1);//默认值是 0 可以改默认
v1.resize(4);
v1.resize(6, 5);
printVector(v1);
int s1 = v1.capacity();//容量
int s2 = v1.size();//元素的个数
cout << "s1 = " << s1 << " , s2 = " << s2 << endl;

}


//vector数据存取操作
void test04()
{
int arr[] = {100, 200, 300, 400};
vector<int> v1(arr, arr + sizeof(arr)/sizeof(int));//默认构造函数
for(int i = 0; i < v1.size(); i++)
{
cout << v1[i] << " ";
}
cout << endl;
for(int i = 0; i < v1.size(); i++)
{
cout << v1.at(i) << " ";//抛异常
}
cout << endl;
try
{
v1.at(100);
}
catch(...)
{
cout << "抓取异常" << endl;
}
//区别at抛异常 []不抛异常


cout << "front:" << v1.front() << endl;
cout << "back: " << v1.back() << endl; 
}


//插入和删除
void test05()
{
vector<int> v;
v.push_back(10);
v.push_back(20);
//头插法
v.insert(v.begin(), 30);
v.insert(v.end(), 40);
printVector(v);
v.insert(v.begin() + 2, 100);//vector支持随机访问
//支持数组下标,一般都支持随机访问
//迭代器可以直接+2 +3 -2 -5操作
printVector(v);


//删除
v.erase(v.begin());
printVector(v);
v.erase(v.begin() + 1, v.end());
printVector(v);
v.clear();
cout << "size :" << v.size() << endl;
}


//巧用swap缩减空间
void test06()
{
//vector添加元素他会自动增长 你删除元素的时候,会自动减少吗?
vector<int> v;
for(int i = 0; i < 100000; i++)
v.push_back(i);


cout << "size: " << v.size() << endl;
cout << "capacity: " << v.capacity() << endl; 
v.resize(10);
cout << "------------" << endl;
cout << "size: " << v.size() << endl;
cout << "capacity: " << v.capacity() << endl;


//收缩内存空间
vector<int> (v).swap(v);
cout << "------------" << endl;
cout << "size: " << v.size() << endl;
cout << "capacity: " << v.capacity() << endl;


}


void test07()
{
//reserve预留空间 resize区别
int num = 0;
int *address = NULL;
vector<int> v;
v.reserve(100000);
for(int i = 0; i < 100000; i++)
{
v.push_back(i);
if(address != &v[0])
{
num++;
address = &v[0];
}
}
cout << "num : " << num << endl;


//如果你知道一个容器大概的预留空间,可以用reserve();
}


int main(int argc, char *arv[])
{
// test01();
// test02();
// test03();
// test04();
// test05();
// test06();
test07();
return 0;
}
21世纪什么最重要?通用!想让你的图形控件和主流软件共享同一种编辑结果吗,那就选择我吧!国内唯一全面基于国际矢量图形标准SVG的专业开发控件,提供全面的矢量编辑能力,能适应组态软件和其他图形软件开发需要。能够和其他主流的编辑软件如illustrator,Visio等共享最终编辑结果。使用VectorControl.Net,您可以:> 基本形状绘制,支持圆、椭圆、矩形、正方形、直线、多边形、折线的绘制> 图像和文本构造,支持导入图像和文本构造> 扩展形状绘制,支持星形形状和扇形的构造> 钢笔工具绘制,支持任意形状的曲线构造(贝赛尔曲线)> 二维变换,支持缩放、扭曲、平移和旋转等二维变换,并可以启用或禁用这些操作。> 图形的成组和解组> 图形的层次调整> 支持多个图形之间的对齐> 支持多个图形之间的分布功能> 调整多个图形的尺寸以达到相同高度或宽度> 网格、参考线、标尺等完整视图环境并支持吸附。> 支持外部自定义形状和图元文件,给与用户自由扩展功能的能力,并能将当前绘图内容导出为形状和图元> 支持连接线,可以在对象之间保持联系> 无限制的撤销/重作> 支持SVG文件的导入> Bmp,Jpg,Gif,Tiff等多种栅格图像格式的导出> SVG文件代码预览> VectorControl.Net还提供了许多Windows界面开发组件,包括弹出菜单时容器,形状和组件库选择器等> 打印支持> 两套完整的示例程序以及源代码(C#和VB.Net),全面全面展现了如何利用VectorControl.Net控件实现简单的矢量应用(不需要任何手工编码实现SVG浏览器)和利用VectorControl实现一个完整的矢量编辑环境(具备所有矢量图形编辑功能)的能力,您甚至可以直接将我们提供的示例程序用作您默认的矢量图形的编辑器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值