关于C++中的vector的一些学习记录
vector是C++中的一个数据结构,确切的说是一个类,相当于动态数组,当编程的时候无法知道自己需要多大的数组规模的时候可以使用vector节约空间和节省代码的作用(我理解vector无法实现节约时间的作用,因为极有可能是类似于C语言中的单链表的方式来实现的,那么就会存在申请内存的时间,肯定会消耗比单纯一次性申请足量的数组使用的时间要长)。
用法
- 使用的时候首先需要包含vector头文件:
#include<vector>
- 还需要加上
using namespace std;
因为是命名空间std中的类。
声明方式
vector<元素数据类型> 变量名;
- vector<int> a;
声明了一个int
数组a[];
,但是长度动态变化,可以向里面增加或者删除int
元素;
- vector<char> a;
声明了一个char
数组a[];
,但是长度动态变化,可以向里面增加或者删除char
元素;
- 使用vector代替二维数组。只是需要声明一个一位数组向量即可,而一个数组的名字其实代表的就是他的首地址,所以只是需要声明一个地址的向量即可:vector<int*> a;
,三维的表示方法则是vector<int**> a;
vector中常用的操作函数包含(有一些没有写到是暂时没有使用到过,以后会补充):
a.push_back();//在尾部增加一个数据
a.pop_back();//删除最后一个数据
a.at(idx);//传回指向索引idx的数据,如果idx越界,则抛出out_of_range
a.begin();//返回指向容器第一个元素的迭代器,是个地址
a.end()();//返回指向容器末端元素的下一个,是个地址,指向一个不存在的元素
a.front();//传回第一个数据
a.back();//传回最后一个数据,不检查该数据是否存在
a.max_size();//返回容器中最大数据的数量
a.capacity();
a.size();//返回容器中的元素个数
a.resize();//重新制定队列的长度
a.reserve();//保留适当的容量
a.erase(pos);//删除pos位置的元素,传回下一个数据的位置
a.erase(beg,end);//删除位置beg到位置end的数据,传回下一个数据的位置
a.clear();//移出容器中所有的数据
a.rbegin();//传回一个逆向队列的第一个数据
a.rend();//传回一个逆向队列的最后一个数据的下一个位置
a.empty();//判断容器是否为空
a.swap(b);//将a和b元素进行互换也可以通过swap(a,b);实现
a.assign();
a.shrink_to_fit();
a.crbegin();
a.crend();
a.cbegin();
a.cend();
a.emplace();
a.data();
a.insert(pos,elem);//在pos位置插入一个元素elem,传回新数据位置
a.insert(pos,n,elem);//在pos位置插入n个elem数据,无返回值
a.insert(pos,beg,end);//在pos位置处插入位置beg到位置end之间的数据,无返回值
a.emplace_back();
再次把之前联想回文数那道题目的vector方法贴上来,顺便自己再琢磨琢磨vector实现二维数组的方法与要点:
#include<iostream>
#include<vector>
using namespace std;
bool isPalindrome(int x)
{
vector<int> eve;
int i;
cout<<"input num is "<<x<<endl;
while(x/10 >= 1)
{
eve.push_back(x % 10);
x = x / 10;
}
eve.push_back(x);
int len = eve.size();
for(i = 0;i <= (len /2);i++)
{
int tmp1 = eve.at(i);
int tmp2 = eve.at(len - i - 1);
cout<<tmp1<<" and "<<tmp2<<endl;
if(tmp1 != tmp2)
{
return false;
}
}
return true;
}
void main(void)
{
int x;
cin>>x;
while(x<0)
{
cout<<"input must larger than or equal to 0!"<<endl;
cin>>x;
}
cout<<isPalindrome(x)<<endl;
system("pause");
}