C++ 数组 array 和vector间的联系和区别
一.C++ 数组 array 和vector间的联系和区别相同点:1.都和数组类似,都可以使用标准数组的表示方法来访问每个元素;array和vector都针对下标运算符[]进行了重载2.三者的存储都是使用的连续内存,都可以进行随机访问;在array和vector的底层存储结构均使用数组。不同点:1.array和数组属于定长容量,定义后的空间是固定的,不能进行改变;但是vector属于变长容器,提供
一.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;
}
更多推荐
所有评论(0)