您的位置:首页 > 其它

vector容器使用方法

2018-03-08 12:48 134 查看
/*
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: