C++之vector⽤法及⼆维数组
Part Ⅰ vector⽤法
⽬录
介绍
⽤法
头⽂件
vector声明及初始化
vector基本操作
1.容量
2.修改
3.迭代器
4.元素的访问
算法
特别注意:
建⽴⼆维数组
vector的元素是结构体
函数原型:
void assign(const_iterator first,const_iterator last);
void assign(size_type n,const T& x = T());
功能:
将区间[first,last)的元素赋值到当前的vector容器中,或者赋n个值为x的元素到vector容器中,这个容器会清除掉vector容器中以前的内容。
实例:v2.assign(v1.begin(), v1.end());
3.迭代器
开始指针:vec.begin();
末尾指针:d(); //指向最后⼀个元素的下⼀个位置
指向常量的开始指针: vec.cbegin(); //意思就是不能通过这个指针来修改所指的内容,但还是可以通过其他⽅式修改的,⽽且指针也是可以移动的。
指向常量的末尾指针: d();
//使⽤迭代器访问元素.
vector<int>::iterator it;
for(it=vec.begin();it!=d();it++)
cout<<*it<<endl;
下标访问: vec[1]; //并不会检查是否越界,下标是从0开始的
at⽅法访问: vec.at(1); //以上两者的区别就是at会检查是否越界,是则抛出out of range异常
访问第⼀个元素: vec.front();
访问最后⼀个元素: vec.back();
返回⼀个指针: int* p = vec.data(); //可⾏的原因在于vector在内存中就是⼀个连续存储的数组,所以可以返回⼀个指针指向这个数组。这是是C++11的特性。
算法
遍历元素
vector<float> vecClass;
int nSize = vecClass.size();
//打印vecClass,⽅法⼀:
for(int i=0;i<nSize;i++)
{
cout<<vecClass[i]<<" ";
}
cout<<endl;
//需要注意的是:以⽅法⼀进⾏输出时,数组的下表必须保证是整数。
//打印vecClass,⽅法⼆:
for(int i=0;i<nSize;i++)
{
cout<<vecClass.at(i)<<" ";
}
cout<<endl;
//打印vecClass,⽅法三:输出某⼀指定的数值时不⽅便
vector<int>::iterator it;
for (it = vec.begin(); it != d(); it++)
cout << *it << endl;
//或者
for (size_t i = 0; i < vec.size(); i++) {
cout << vec.at(i) << endl;
}
<algorithm>与<vector>的结合使⽤
元素翻转
#include <algorithm>
rever(vec.begin(), d());//将元素翻转,即逆序序列
#include <algorithm>
sort(vec.begin(), d()); //采⽤的是从⼩到⼤的排序
//如果想从⼤到⼩排序,可以采⽤上⾯反转函数,也可以采⽤下⾯⽅法:
bool Comp(const int& a, const int& b) {
return a > b;
}
sort(vec.begin(), d(), Comp);
特别注意:
1.如果你要表⽰的向量长度较长(需要为向量内部保存很多数),容易导致内存泄漏,⽽且效率会很低。
2.Vector作为函数的参数或者返回值时,需要注意它的写法:
double Distance(vector<int>&a, vector<int>&b) //其中的“&”绝对不能少!
⼀维数组a[5]中&a和a区别
#include "stdio.h"
int main()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
return 0;
}
答案:2,5
区别:a代表数组a[5]的⾸地址,&a代表数组整体的地址,虽然他们的地址数是⼀样的,但是含义不⼀样的。
注意 a 是表⽰数组a[5] 的。
*(a + 1) 和 *(&a + 1)区别见见下图。*(a + 1) 这个好理解,但*(&a + 1)理解起来别扭,把&a看成表⽰数组整体的长度,加⼀表⽰数组整体长度后移(见图红⾊的⽅框,到了a[5]位置,其实数组只有到a[4],所以相当与数组整体后移了)。
vector<vector<int> > array(m); //这个m⼀定不能少
//初始化⼀个m*n的⼆维数组
for(int i=0;i<m;i++) {
array[i].resize(n);
}
array[0].size(); //指第⼀⾏的列
//第⼀种⽅法
#include<iostream>
#include<vector>
using namespace std;
int main() {
vector<vector<int> > array(4);
for(int i=0;i<4;i++) {
array[i].resize(5);
}
//输出⼆维数组的⾏和列
cout<<"Row:"<<array.size()<<" Column:"<<array[0].size()<<endl;
//输出⼆维数组
cout<<"["<<endl;
for(int j=0;j<array.size();j++) {
cout<<"["<<" ";
for(int k=0;k<array[0].size();k++) {
cout<<array[j][k]<<" ";
}
cout<<"]"<<endl;
}
cout<<"]"<<endl;
return 0;
}
//第⼆种⽅法
#include <vector>
#include <iostream>
using namespace std;
int main(){
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;
}
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;
el
{
if(length!=a.length)
return length<a.length;
el
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;
}