C++容器(STL vector类模版总结)---3

vector是最简单的顺序(序列)式容器,支持随机访问。vector就像一个动态数组,是典型的“将元素至于动态数组中加以管理”的抽象概念。vector可以实现数据结构中的队列、数组和堆栈的所有功能

在 vector 容器中,根据下标随机访问某个元素的时间是常数,在尾部添加一个元素的时间大多数情况下也是常数,总体来说速度很快

在中间插入或删除元素时,因为要移动多个元素,因此速度较慢,平均花费的时间和容器中的元素个数成正比。

在 vector 容器中,用一个动态分配的数组来存放元素,因此根据下标访问某个元素的时间是固定的,与元素个数无关。

vector 容器在实现时,动态分配的存储空间一般都大于存放元素所需的空间。例如,哪怕容器中只有一个元素,也会分配 32 个元素的存储空间。这样做的好处是,在尾部添加一个新元素时不必重新分配空间,直接将新元素写入适当位置即可。在这种情况下,添加新元素的时间也是常数。但是,如果不断添加新元素,多出来的空间就会用完,此时再添加新元素,就不得不重新分配内存空间,把原有内容复制过去后再添加新的元素。碰到这种情况,添加新元素所花的时间就不是常数,而是和数组中的元素个数成正比。
至于在中间插入或删除元素,必然涉及元素的移动,因此时间不是固定的,而是和元素个数有关。
vector中的成员函数具体可查阅 :www.cplusplus.com

vector基本用法

#include <iostream>
#include <vector>  //使用vector需要包含此头文件
using namespace std;
template <class T>
void PrintVector(const vector <T> & v)
{  //用于输出vector容器的全部元素的函数模板
    vector <T>::const_iterator i;
   
    for (i = v.begin(); i != v.end(); ++i)
        cout << *i << " ";
    cout << endl;
}
int main()
{
    int a[5] = { 1, 2, 3, 4, 5 };
    vector <int> v(a, a + 5);  //将数组a的内容放入v
    cout << "1) " << v.end() - v.begin() << endl;  //两个随机迭代器可以相减,输出:1)5
    cout << "2)"; PrintVector(v);  //输出:2)1 2 3 4 5
    v.insert(v.begin() + 2, 13);  //在 begin()+2 位置插人 13
    cout << "3)"; PrintVector(v);  //输出:3)1 2 13 3 4 5
    v.erase(v.begin() + 2);  //删除位于 begin()+2 位置的元素
    cout << "4)"; PrintVector(v);  //输出:4)1 2 3 4 5
    vector<int> v2(4, 100);  //v2 有 4 个元素,都是 100
    v2.insert(v2.begin(), v.begin() + 1, v.begin() + 3);  //将v的一段插入v2开头
    cout << "5)v2:"; PrintVector(v2);  //输出:5)v2:2 3 100 100 100 100
    v.erase(v.begin() + 1, v.begin() + 3);  //删除 v 上的一个区间,即 [2,3)
    cout << "6)"; PrintVector(v);  //输出:6)1 4 5
    return 0;
}

vecrot嵌套形成可变长的二维数组

#include <iostream>
#include <vector>
using namespace std;
int main()
{   
    vector<vector<int> > v(3); //v有3个元素,每个元素都是vector<int> 容器
    for(int i = 0;i < v.size(); ++i)
        for(int j = 0; j < 4; ++j)
            v[i].push_back(j);
    for(int i = 0;i < v.size(); ++i) {
        for(int j = 0; j < v[i].size(); ++j)
            cout << v[i][j] << " ";
        cout << endl;
    }
    return 0;
}

vector的增删改查

//push_back/pop_back

#include <iostream>
#include <stdlib.h>
#include <vector>

using namespace std;


int main()
{
	int a[] = { 1, 2, 3, 4 };
	vector<int> v(a, a + sizeof(a) / sizeof(int)); //为v分配大小
	vector<int>::iterator i = v.begin();
	while (i != v.end())
	{
		cout << *i << " ";
		++i;
	}
	cout << endl;

	v.pop_back();  //删除末尾4
	v.pop_back(); //删除末尾3
	v.push_back(6); //在末尾加上6
	i = v.begin();
	while (i != v.end())
	{
		cout << *i << " ";
		++i;
	}
	cout << endl;
	system("pause");
	return 0;
}

 

//find/insert/erase

#include <iostream>
#include <stdlib.h>
#include <vector>

using namespace std;


int main()
{
	int a[] = {1,2,3,4,5,6};
	vector<int> v(a, a + sizeof(a) / sizeof(int));
	//使用find在[begin,end)区域内寻找3的位置
	vector<int>::iterator i = find(v.begin(),v.end(),3);
	//在3位置之前插入数字30
	v.insert(i, 30);

	vector<int>::iterator it = v.begin();
	while (it != v.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
	//寻找4的位置并删除
	i = find(v.begin(), v.end(), 4);
	v.erase(i);

	it = v.begin();
	while (it != v.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
	system("pause");
	return 0;
}

operator[] +index 和C++11中vector的新式for+auto的遍历方式

#include <iostream>
#include <stdlib.h>
#include <vector>

using namespace std;


int main()
{
	int a[] = {1,2,3,4};
	vector<int> v(a, a + sizeof(a) / sizeof(int));
	//通过[]读取第0个位置,并赋值为10
	v[0] = 10;
	cout << v[0] << endl;
	//通过[i]的方式遍历vector 内容为10 2 3 4
	for (size_t i = 0; i < v.size(); ++i)
	{
		cout << v[i] <<" ";
	}
	cout << endl;
	//创建v2容器 内容为5 6 7 8
	int b[] = { 5, 6, 7, 8 };
	vector<int> v2(b, b + sizeof(b) / sizeof(int));

	//v2与v中元素进行交换
	v2.swap(v);
	cout << "v_swap data:";  //内容为 5 6 7 8
	for (size_t i = 0; i < v.size(); ++i)
	{
		cout << v[i] <<" ";
	}
	cout << endl;

	cout << "v2_swap data:"; //内容为 10 2 3 4
	for (size_t i = 0; i < v2.size(); ++i)
	{
		cout << v2[i] << " ";
	}
	cout << endl;

	//c++11支持的新式遍历v中元素
	cout << "C++11:";
	for (auto x : v)
	{
		cout << x << " ";
	}
    system("pause");
	return 0;
}

vector迭代器失效问题

int a[] = { 1, 2, 3, 4 };
	vector<int>v(a, a + sizeof(a) / sizeof(int));
	//使用find查找3所在位置的iterator
	vector<int>::iterator pos = find(v.begin(),v.end(),3);
	//删除pos位置处的数据,导致pos迭代器失效
	v.erase(pos);
	cout << *pos << endl;
	
	// 在pos位置插入数据,导致pos迭代器失效。
	// insert会导致迭代器失效,是因为insert可
	// 能会导致增容,增容后pos还指向原来的空间,而原来的空间已经释放了
	pos = find(v.begin(), v.end(), 3);
	v.insert(pos, 3);
	cout << *pos << endl;//此处会导致非法访问

将代码进行修改后

int a[] = { 1, 2, 3, 4 };
	vector<int>v(a, a + sizeof(a) / sizeof(int));
	//使用find查找3所在位置的iterator
	vector<int>::iterator pos = find(v.begin(),v.end(),3);
	//删除pos位置处的数据,导致pos迭代器失效
	v.erase(pos);
	
	
	// 在pos位置插入数据,导致pos迭代器失效。
	// insert会导致迭代器失效,是因为insert可
	// 能会导致增容,增容后pos还指向原来的空间,而原来的空间已经释放了
	pos = find(v.begin(), v.end(), 3);
	v.insert(pos, 4);
	//cout << *pos << endl;
	vector<int>::iterator it = v.begin();
	while (it != v.end())
	{
		cout << *it << " ";
		++it;
	}

使用sort()算法对vector进行排序

#include <iostream>
#include <vector>
#include <stdlib.h>
#include <algorithm>

using namespace std;

int main()
{
	int a[] = {1,23,2,3,5,6,10,20,3,2,1};
	vector<int> v(a,a+sizeof(a)/sizeof(int));
	cout << "初始数据:";
	for (auto x:v)
	{
		cout<< x << " ";
	}
	cout << endl;
	cout << "从小到大排序:";
	sort(v.begin(), v.end());
	for (auto x : v)
	{
		cout << x << " ";
	}
	
	cout << endl;
	sort(v.rbegin(), v.rend());
	cout << "从大到小排序:";
	for (auto x : v)
	{
		cout << x << " ";
	}
	cout << endl;
	system("pause");
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章