今天初步学习了vector,了解初步的使用方法: 构造函数了解这三个即可足够使用(与string的构造有异曲同工之妙)
构造函数声明 | 接口说明 |
---|---|
vector()(重点) | 无参构造 |
vector(size_type n, const value_type& val = value_type()) | 构造并初始化n个val |
vector (const vector& x); (重点) | 拷贝构造 |
常用函数接口与string相似,在了解过string的使用之后,只需稍微熟悉一下就能熟练使用!!!
容量空间 | 接口说明 |
---|---|
size | 获取数据个数 |
capacity | 获取容量大小 |
empty | 判断是否为空 |
resize(重点) | 改变vector的size |
reserve (重点) | 改变vector的capacity |
增删查改的接口也与string类似 ,稍微查看就可以熟练使用
vector增删查改 | 接口说明 |
---|---|
push_back(重点) | 尾插 |
pop_back (重点) | 尾删 |
find | 查找。(注意这个是算法模块实现,不是vector的成员接口) |
insert | 在position之前插入val |
erase | 删除position位置的数据 |
swap | 交换两个vector的数据空间 |
operator[] (重点) | 像数组一样访问 |
迭代器与string也是一模一样:
iterator的使用 | 接口说明 |
---|---|
begin +end(重点) | 获取第一个数据位置的iterator/const_iterator, 获取最后一个数据的下一个位置的iterator/const_iterator |
rbegin + rend | 获取最后一个数据位置的reverse_iterator,获取第一个数据前一个位置的reverse_iterator |
这样基本我们就可以进行vector的习题了,接下来我们一起来解决问题
这个非常好理解,【2 , 2 ,1】就返回 1 即可。我们之前学习C语言时期也做过类似题目:单身狗
相信大家对位运算一定不陌生,我们遍历数组,依次按位异或就可以把“单身狗”找到。或者使用哈希算法也可以,这道题使用基础的按位异或就可以了:
class Solution {
public:
int singleNumber(vector<int>& nums) {
int size = nums.size();
int ans = 0;
for(int i = 0;i<size;i++){ ans ^= nums[i];}
return ans;
}
};
我们来提交!!! 过啦!!!
杨辉三角是中国古代数学的杰出研究成果之一,它把二项式系数图形化,把组合数内在的一些代数性质直观地从图形中体现出来,是一种离散型的数与形的结合。 而这道题我们来通过vector来实现一下杨辉三角,这道题使用C++语言是比C语言方便许多许多,来我们想一想如果使用C语言,会遇到哪些难点:
int* returnSize, int** returnColumnSizes
这两个参数,首先我们就需要理解这是干什么的,其次还有使用指针操作。而对于C++来说,使用一个vector就可以避开这些难题。
逻辑非常简单,,每行都进行一次运算,根据杨辉三角的规律,逐步写出就可以了:
class Solution {
public:
vector<vector<int>> generate(int numRows) {
//开辟容器的容器(对比二维数组)
vector<vector<int>> vv(numRows);
//按行进行处理
for (int i = 0; i < numRows; i++) {
//每行都是 i + 1 个元素
vv[i].resize(i + 1,0);
//前两行单独处理
vv[i][0] = 1;
vv[i][i] = 1;
//其他行进行数据处理
if (i > 1) {
for (int j = 1; j < i; j++) {
vv[i][j] = vv[i - 1][j - 1] + vv[i - 1][j];
}
}
}
return vv;
}
};
我们提交一下:过啦!!!!!!! 这两道都是比较简单的,随后我们上点强度!!! 家人们,跟上节奏!!!
出现三次的数字,这样就不能使用按位异或来进行快速解决了,我们就必须尝试其他算法。 那么我们可以使用什么算法呢???这种出现数字的题目基本都可以使用哈希算法(强化版计数排序),只需遍历一次容器,统计出现次数,然后再遍历一次找到出现一次的数字就可以了。
class Solution {
public:
int singleNumber(vector<int>& nums) {
//使用 图 来进行哈希算法
map<int,int> hash;
//迭代器处理
for(auto i:nums){
hash[i]++;
}
//遍历一次
for(auto [num,cnt]:hash){
if(cnt == 1) return num;
}
//照顾编译器
return -1;
}
};
这里使用的图可以理解为一种储存两个值的容器(实际底层实现是红黑树)具有以下特性: map是STL的一个关联容器,它提供一对一的hash。
Map主要用于一对一映射(one-to-one)的情況
了解这个之后,就好理解我们的代码了,与传统的计数排序思想是一致的。
我们来提交一下:过啦!!!!!!
这个可以在只出现一次的数字Ⅱ的基础上进行改进,这道题要求返回一个vector<int> ,所以我们就创建一个vector容器,把出现一次的都插入到vector中就可以了
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
//使用图来实现哈希算法
map<int ,int> hash;
//答案容器
vector<int> ans;
//遍历两次,干脆解决
for(int i :nums){
hash[i]++;
}
for(auto [num,cnt]:hash){
if(cnt == 1) ans.push_back(num);
}
return ans;
}
};
我们提交一下:过啦!!!!!!!!
今天我们接触了vector的初步使用,下一篇文章带大家一起手搓vector。
可是换个角度来说,正因为是一张白纸,才可以随心所欲地描绘地图。一切全在你自己。对你来说,一切都是自由的,在你面前是无限的可能。 ———东野圭吾