一.C++ 数组 array 和vector间的联系和区别

相同点:

1.都和数组类似,都可以使用标准数组的表示方法来访问每个元素;array和vector都针对下标运算符[]进行了重载
2.三者的存储都是使用的连续内存,都可以进行随机访问;在array和vector的底层存储结构均使用数组。

不同点:

1.array和数组属于定长容量,定义后的空间是固定的,不能进行改变;
但是vector属于变长容器,提供了可以动态插入和删除元素的机制,可以根据数据的 插入删除重新构建容器容量(1.5-2倍),即可以进行再加或减。

2.array定义的时候必须定义数组的元素个数;而vector 不需要;且只能包含整型字面值常量,枚举常量或者用常量表达式初始化的整型const对象,非const变量以及需要到运行阶段才知道其值的const变量都不能用来定义数组的维度。

3.array和vector提供了更好的数据访问机制,即可以使用front()和back()以及at()(at()可以避免a[-1]访问越界的问题)访问方式,访问更加安全;
而数组只能通过下标访问,更容易引发访问错误。

4.array和vector提供了两个容器对象的内容交换,即swap的机制;
而数组对于交换只能通过遍历的方式,逐个元素交换的方式使用。

5.array和vector提供了size()和Empty()的获取机制;
而数组只能通过sizeof()/strlen()以及遍历计数来获取大小和是否为空。

6.array和vector提供了更好的遍历机制,即有正向迭代器和反向迭代器两种。

7.数组是不安全的;
array和vector是比较安全的(有效的避免越界等问题)

8.array和vector在声明变量后,在声明周期完成后,会自动地释放其所占用的内存;
对于数组如果用new[ ]/malloc申请的空间,必须用对应的delete[ ]和free来释放内存。
9.vector有一系列的函数操作,非常方便使用.和vector不同,数组不提供 push——back或者其他的操作在数组中添加新元素,数组一经定义就不允许添加新元素;
若需要则要充许分配新的内存空间,再将员数组的元素赋值到新的内存空间。

10.数组和array不同,一个数组不能用另一个数组初始化,也不能将一个数组赋值给另一个数组。
但是array可以将一个数组对象赋值给另一个数组对象。

11.array提供了初始化所有成员的方法fill().

二.C++ vector的用法

vector被称为容器,其包含着一系列连续存储的元素,其行为和数组类似,顺序存储结构。可以快速访问vector中的任意元素,也可以从末尾添加元素或删除元素
其他位置插入和删除较慢。
vector是C++STL的一个重要成员,使用它时需要包含头文件

#include<vector>;

1.vector容器对象

#if 1
int main()
{
	//vector<T> v1; //T类型

	vector<int> v1; //容器自动增长
	vector<float> fvec;//类型 对象(类型的实例)     变量类型 变量名
	//vector<>动态数组
	//1.存储同一类型的元素
	//2.可以动态增长 却决于内存限制   数组编译期确定了大小

	vector<int> v2(v1); //v1初始化v2 拷贝
	vector<int> v3 = v1;
	//vector<int> v4(n, val);
	vector<int> v4(10, -1);//十个-1
	vector<int> v5(10);//当前类型默认值初始化

	//列表初始化
	vector<string>v6{ "a","666","12322" };
	vector<string>v7 = { "a","666","12322" };

	//原始视图  向量内部是如何使用的
	//引用对象不是一个确切的对象 不能集合  //vector<int &> v8

	vector<bool> vbools;// 是容器不是STL(标准模板类)容器

}

#endif // 1


2.构造函数

	vector<int> myVector(5, 10);//5个元素,每个元素为10
	vector<int>::iterator ite = myVector.begin();
	for (ite; ite != myVector.end(); ite++)
	{
		cout << *ite << '\t';
	}
	cout << "\n";

	vector<int> myVector2(myVector);//另一个vector作为参数
	ite = myVector2.begin();
	for (ite; ite != myVector2.end(); ite++)
	{
		cout << *ite << '\t';
	}
	cout << "\n";



	ite = myVector2.begin();
	ite++;
	ite += 2;
	vector<int> myVector3(ite, myVector2.end());//另一个vector作为参数
	ite = myVector3.begin();
	for (ite; ite != myVector3.end(); ite++)
	{
		cout << *ite << '\t';
	}
	cout << "\n";

3.基本操作

(1)头文件#include.

(2)创建vector对象,vector vec;

(3)尾部插入数字:vec.push_back(a);

(4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。

(5)使用迭代器访问元素.

vector<int>::iterator it;
for(it=vec.begin();it!=vec.end();it++)
    cout<<*it<<endl;

(6)插入元素: vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;

(7)删除元素: vec.erase(vec.begin()+2);删除第3个元素

vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始

(8)向量大小:vec.size();

(9)清空:vec.clear();

注意:这里有begin()与end()函数、front()与back()的差别
*

4.访问或修改vector中的某个下标特定元素:

1)使用[ ]

	vector<int> myVector(5, 10);//5个元素,每个元素为10
	vector<int>::iterator ite = myVector.begin();
	cout << myVector[5] << "\n";//这样会报错,越界了
	myVector[5] = 100;//这样会报错,越界了

2)使用at()方法
如果产生越界,那么抛出异常out_of_range

	vector<int> myVector(5, 10);//5个元素,每个元素为10
	vector<int>::iterator ite = myVector.begin();
	//cout << myVector[5] << "\n";
	//myVector[5] = 100;
	
	try
	{
		//修改下标为5的元素
		myVector.at(5) = 200;
	}
	catch (out_of_range)
	{
		cout << "越界异常" << '\n';
		return 0;
	}
	catch (...)
	{
		cout << "未知异常" << '\n';
	}


5.操作用法实例

5.1使用assign() 给vector重新赋值,之前的元素全部清除,再赋值

	vector<int> myVector(5, 10);//5个元素,每个元素为10
	vector<int>::iterator ite = myVector.begin();
	for (ite; ite != myVector.end(); ite++)
	{
		cout << *ite << '\t';
	}
	cout << "\n";

	myVector.assign(3, 2);//重新赋值为3个元素,每个元素为2
	ite = myVector.begin();
	for (ite; ite != myVector.end(); ite++)
	{
		cout << *ite << '\t';
	}
	cout << "\n";

	myVector.assign(8, 0);//重新赋值为6个元素,每个元素为0
	ite = myVector.begin();
	for (ite; ite != myVector.end(); ite++)
	{
		cout << *ite << '\t';
	}
	cout << "\n";

5.2使用front()返回vector起始元素,back()返回vector的最后一个元素

	vector<int> myVector(5, 0);//5个元素,每个元素为0
	//给myVector每个下标赋值
	for (int i = 0; i < 5; i++)
	{
		myVector.at(i) = i;
	}

	//遍历vector
	vector<int>::iterator ite = myVector.begin();
	for (ite; ite != myVector.end(); ite++)
	{
		cout << *ite << '\t';
	}
	cout << "\n";

	cout << "起始元素: " << myVector.front() << "\n";
	cout << "最后一个元素: " << myVector.back() << "\n";

5.3使用push_back(),在末尾添加元素;使用pop_back(),在末尾删除
注:没有头添加和头删除

	vector<int> myVector(5, 0);//5个元素,每个元素为0
	//给myVector每个下标赋值
	for (int i = 0; i < 5; i++)
	{
		myVector.at(i) = i;
	}

	//遍历vector
	vector<int>::iterator ite = myVector.begin();
	for (ite; ite != myVector.end(); ite++)
	{
		cout << *ite << '\t';
	}
	cout << "\n";
	
	//尾添加
	myVector.push_back(100);
	myVector.push_back(200);

	ite = myVector.begin();
	for (ite; ite != myVector.end(); ite++)
	{
		cout << *ite << '\t';
	}
	cout << "\n";

5.4使用empty()判断元素是否为空;使用clear()清空元素

	vector<int> myVector(5, 0);//5个元素,每个元素为0
	//给myVector每个下标赋值
	for (int i = 0; i < 5; i++)
	{
		myVector.at(i) = i;
	}

	//遍历vector
	vector<int>::iterator ite = myVector.begin();
	for (ite; ite != myVector.end(); ite++)
	{
		cout << *ite << '\t';
	}
	cout << "\n";

	//判断元素是否为空
	cout << boolalpha << myVector.empty() << "\n";

	//清空元素
	myVector.clear();

	cout << boolalpha << myVector.empty() << "\n";

5.5使用insert插入

	vector<int> myVector;//5个元素,每个元素为0
	
	myVector.push_back(4);
	myVector.push_back(5);
	myVector.push_back(6);

	//遍历vector
	vector<int>::iterator ite = myVector.begin();
	for (ite; ite != myVector.end(); ite++)
	{
		cout << *ite << '\t';
	}
	cout << "\n\n";

	cout << "insert(ite, 3);后" << "\n";
	ite = myVector.begin();
	myVector.insert(ite, 3);//插入元素3

	//遍历vector
	ite = myVector.begin();
	for (ite; ite != myVector.end(); ite++)
	{
		cout << *ite << '\t';
	}
	cout << "\n\n";


	cout << "insert(myVector.end(), 2, 0);后" << "\n";
	myVector.insert(myVector.end(), 2, 0);//插入2个66元素

	//遍历vector
	ite = myVector.begin();
	for (ite; ite != myVector.end(); ite++)
	{
		cout << *ite << '\t';
	}
	cout << "\n\n";

	cout << "insert(myVector.begin(), vectorInsert.begin(), vectorInsert.end());后" << "\n";
	vector<int> vectorInsert;
	vectorInsert.push_back(0);
	vectorInsert.push_back(1);
	vectorInsert.push_back(2);

	myVector.insert(myVector.begin(), vectorInsert.begin(), vectorInsert.end());

	//遍历vector
	ite = myVector.begin();
	for (ite; ite != myVector.end(); ite++)
	{
		cout << *ite << '\t';
	}
	cout << "\n\n";

5.6使用swap()交换两个vector元素

	vector<int> myVector;//5个元素,每个元素为0
	
	myVector.push_back(4);
	myVector.push_back(5);
	myVector.push_back(6);

	vector<int> myVector2(2, 0);

	//遍历vector
	vector<int>::iterator ite = myVector.begin();
	for (ite; ite != myVector.end(); ite++)
	{
		cout << *ite << '\t';
	}
	cout << "\n\n";

	//遍历vector
	ite = myVector2.begin();
	for (ite; ite != myVector2.end(); ite++)
	{
		cout << *ite << '\t';
	}
	cout << "\n\n";

	//交换两个vector
	myVector.swap(myVector2);

	//遍历vector
	ite = myVector.begin();
	for (ite; ite != myVector.end(); ite++)
	{
		cout << *ite << '\t';
	}
	cout << "\n\n";

	//遍历vector
	ite = myVector2.begin();
	for (ite; ite != myVector2.end(); ite++)
	{
		cout << *ite << '\t';
	}
	cout << "\n\n";

6.二维数组的使用:

#include "stdafx.h"
#include <cv.h>
#include <vector> 
#include <iostream> 
using namespace std;
int main()
{
	using namespace std;
	int out[3][2] = { 1, 2, 
			 3, 4,
			5, 6 };
	vector <int*> v1;
 
	v1.push_back(out[0]);
	v1.push_back(out[1]);
	v1.push_back(out[2]);
 
	cout << v1[0][0] << endl;//1
	cout << v1[0][1] << endl;//2
	cout << v1[1][0] << endl;//3
	cout << v1[1][1] << endl;//4
	cout << v1[2][0] << endl;//5
	cout << v1[2][1] << endl;//6
 
	return 0;
}

7.vector定义结构体

vector的元素不仅仅可以是int,double,string等,还可以是结构体,但是要结构体要定义为全局的,否则会出错。

#include<stdio.h>
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;
 
typedef struct rect
{
    int id;
    int length;
    int width;
 
  //对于向量元素是结构体的,可在结构体内部定义比较函数,下面按照id,length,width升序排序。
  bool operator< (const rect &a)  const
    {
        if(id!=a.id)
            return id<a.id;
        else
        {
            if(length!=a.length)
                return length<a.length;
            else
                return width<a.width;
        }
    }
}Rect;
 
int main()
{
    vector<Rect> vec;
    Rect rect;
    rect.id=1;
    rect.length=2;
    rect.width=3;
    vec.push_back(rect);
    vector<Rect>::iterator it=vec.begin();
    cout<<(*it).id<<' '<<(*it).length<<' '<<(*it).width<<endl;    
 
return 0;
 
}
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐