vector容器

1.vector基本概念

功能:vector 数据结构和数组非常相似,也称单端数组。

vector与普通函数的区别:在于数组是静态空间,而vector可以动态扩展。

动态扩展:并不是在原空间之后接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间。

vector容器的迭代器是支持随机访问的迭代器。

2.vector构造函数(创建vector容器)

函数原型:

  • vector    V                            //使用模板实现类实现。默认构造函数
  • vector  ( v.begin(), v.end() )   //将开始到结束的中间元素拷贝给本身
  • vector (n,elem)                     // 构造函数将n个elem拷贝给本身
  • vector (const vector  &vec)     //拷贝构造函数
#include
#include
#include
#include  //标准算法的头文件 
using namespace std;

void printVector(vector&v)
{

	for (vector::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;                      //打印0 1 2 3 4 5 6 7 8 9

}

void test01()
{
	//1用模板实现
	vector  v1;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
	}
	printVector(v1);                    //打印0 1 2 3 4 5 6 7 8 9

	//2.通过区间方式进行构造
	vectorv2(v1.begin(), v1.end());
	printVector(v2);

	//3.n个elem方式构造
	vectorv3(10, 100);
	printVector(v3);                    //打印10个100

	//4.拷贝构造
	vectorv4(v3);
	printVector(v4);                    //打印10个100


}
int main()
{
	test01(); 
	return 0;
}    

3.vector赋值操作

原型:

  • vector& operator=(const vector&vec)  //重载等号运算符
  • assign (beg ,end)                                    //将(beg,end)区间中的数据拷贝赋值给本身
  • assign(n,elem)                                        //将n个elem拷贝赋值给本身
#include
#include
#include
#include  //标准算法的头文件 
using namespace std;

void printVector(vector&v)
{

	for (vector::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;

}

void test01()
{
	
	vector  v1;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
	}
	printVector(v1);

	//赋值 operator=
	vector v2;
	v2 = v1;
	printVector(v2);

	//assign
	vector v3;
	v3.assign(v1.begin(), v1.end());
	printVector(v3);

    //n个elem方式赋值
	vectorv4;
	v4.assign(10, 100);
	printVector(v4);

}
int main()
{
	test01(); 
	return 0;
}    

 vector容器_第1张图片

4.vector容量和大小(对容器的容量和大小操作)

原型:

  • empty()               // 判断容器是否为空
  • capaticy()                 //容器的容量
  • size()                        //返回容器中元素的个数
  • resize(int num)        //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如                                    果容器变短,则末尾超出容器的长度的元素被删除
  • resize(int num,elem)     //重新指定容器的长度为num,若容器变长,则以默认值填充新位                                             置。如果容器变短,则末尾超出容器的长度的元素被删除
#include
#include
#include
#include  //标准算法的头文件 
using namespace std;

void printVector(vector&v)
{

	for (vector::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;

}

void test01()
{
	
	vector  v1;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
	}
	printVector(v1);

	if (v1.empty())
	{
		cout << "v1为空" << endl;
	}
	else
	{
		cout << "v1不为空" << endl;
		cout << "v1的容量为:" << v1.capacity()<< endl;   //13
		cout << "v1的大小为:" << v1.size() << endl;   //10
	}

	//重新指定大小
	v1.resize(15,100);  //利用重载版本,可以指定默认填充指,参数2
	printVector(v1);   //如果重新指定的比原来的长,默认用0填充新的位置

}
int main()
{
	test01(); 
	return 0;
}    

5.vector插入和删除

  • push_back(ele)                                                    //尾部插入元素ele
  • pop_back()                                                           //删除最后一个元素
  • insert(const_iterator pos,ele)                             //迭代器指向位置pos插入元素ele
  • insert(const_iterator pos,int  count,ele)              //迭代器指向位置pos插入count个元素ele
  • erase(const_iterator pos);                             //删除迭代器指向的元素
  • erase(const_iterator start , const , const_iterator  end);    

         //删除迭代器从start到end之间的元素

  • clear();                                                               //删除容器中的元素
#include
#include
#include
#include  //标准算法的头文件 
using namespace std;

void printVector(vector&v)
{

	for (vector::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;

}

void test01()
{
	
	vector  v1;
	//尾插
	v1.push_back(10);
	v1.push_back(20);
	v1.push_back(30);
	v1.push_back(40);
	v1.push_back(50);

	//遍历
	printVector(v1);
	 
	//尾删
	v1.pop_back();
	printVector(v1);

	//插入
	v1.insert(v1.begin(), 100);
	printVector(v1);

	v1.insert(v1.begin(),2,1000);
	printVector(v1);

	//删除
	v1.erase(v1.begin());
	printVector(v1);

	//清空
	v1.erase(v1.begin(),v1.end());
	printVector(v1);

}
int main()
{
	test01(); 
	return 0;
}    

vector容器_第2张图片

6.vector 数据存储

原型:

  • at ( int dex )                                   //  返回索引 lidx 所指的数据
  • operator[ ]                                   //  返回索引 lidx 所指的数据
  • front()                                    //返回容器中第一个数据元素
  • back()                                    //返回容器中最后一个数据元素
#include
#include
#include
#include  //标准算法的头文件 
using namespace std;

void test01()
{
	
	vector  v1;

	for (int i = 0; i < 10; i++)
	{
		 v1.push_back(i);
	}

	//利用[]方式访问数组中元素
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << " ";
	}
	cout << endl;

	//利用at方式访问数组中元素
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1.at(i) << " ";
	}
	cout << endl;

	//获取他的第一个元素
	cout << "第一个元素:" << v1.front() << endl;

	//获取他的最后一个元素
	cout << "第一个元素:" << v1.back() << endl;


}
int main()
{
	test01(); 
	return 0;
}    

 

 7.vector互换容器

原型:swap(vec)           //将vec与本身的元素互换

#include
#include
#include
#include  //标准算法的头文件 
using namespace std;

void printVector(vector&v)
{

	for (vector::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;

}

void test01()
{
	
	vector  v1;

	for (int i = 0; i < 10; i++)
	{
		 v1.push_back(i);
	}
	cout << "交换前:" << endl;
	printVector(v1);

	vector  v2;
	for (int i = 10; i >0; i--)
	{
		v2.push_back(i);
	}
	cout << "交换后:" << endl;
	printVector(v2);

	v1.swap(v2);
	printVector(v1);
	printVector(v2);
	
}
//实际用途
//巧用swap可以收缩内存空间
void  test02()
{
	vector  v;
	for (int i = 0; i < 100000; i++)
	{
		v.push_back(i);
	}

	cout << "v容量为:" << v.capacity() << endl;
	cout << "v大小为:" << v.size() << endl;


	v.resize(3);//重新指定大小
	cout << "v容量为:" << v.capacity() << endl;
	cout << "v大小为:" << v.size() << endl;


	//巧用swap收缩内存
	vector(v).swap(v);
	cout << "v容量为:" << v.capacity() << endl;
	cout << "v大小为:" << v.size() << endl;
}
int main()
{
	//test01(); 
	test02();
	return 0;
}    

 8.vector 预留空间

减少vector在动态  扩展容量时的扩展次数

原型:reserve(int len)                //容器预留  len个长度元素,预留位置不初始化,元素不可访问

#include
#include
#include
#include  //标准算法的头文件 
using namespace std;


void test01()
{
	vectorv;
	int num = 0;
	int *p = NULL;
	for (int i = 0; i < 10000; i++)
	{
		v.push_back(i);
		if (p != &v[0])
		{
			p = &v[0];
			num++;
		}
	}
	cout << "num=" << num << endl;
}
int main()
{
	test01(); 
	
	return 0;
}    

 

你可能感兴趣的:(QT,算法)