文章目录
- ++和--
- vector
- 二维vector的初始化
- 数组中最大的数max_element()
- 数组所有元素之和accumulate()
- vector数组去重
- 对pair类型的vector排序
- 对元素都为正整数的vector利用sort默认的升序排列进行降序排列
- 一维数组转二维数组
- size_t和int
- 如何不用临时变量交换两个数?
- 将类函数的形参赋值给同名的类成员变量
++和–
以本题为例形如:
left++ == cols 和 ++left == cols 两者的结果是有区别的,前者不成立、后者成立。(自增自减运算符的优先级很低。。。)


vector
二维vector的初始化
- 可以利用另一个二维数组的大小来初始化目标二维vector:
vector<vector<int>> vc1 = { {1,1} ,{1,1},{1,1} };
int rows = vc1.size();
int cols = vc1[0].size();
vector<vector<int>> vc2(rows, vector<int>(cols, 0));

- 和一有区别的是,可以直接通过拷贝构造函数用另一个二维数组直接初始化目标二维vector:
vector<vector<int>> vc1 = { {1,1} ,{1,1},{1,1} };
vector<vector<int>> vc2 = vc1;

数组中最大的数max_element()
max_element():
属于头文件 algorithm ,格式 ForwardIterator max_element (ForwardIterator first, ForwardIterator last); 接受同一数组的两个迭代器参数,构成一个迭代器范,返回迭代器范中最大元素的迭代器。
数组所有元素之和accumulate()
accumulate():
隶属头文件 numeric ,格式 T accumulate (InputIterator first, InputIterator last, T init); 接受同一数组的两个迭代器作为参数,以及一个累加和初始值 init ,返回迭代器范和初始值的累加和。
vector数组去重
unique 去重的前提是数组有序,unique 会将所有重复元素放到数组尾部,并返回不重复内容的尾后迭代器,换言之,也就是第一个重复元素的迭代器,那么就可以调用 erase 从第一个重复元素的迭代器开始删除直至 vector 的 尾后迭代器。
#include <algorithm>
sort(ivec.begin(), ivec.end());
ivec.erase(unique(ivec.begin(), ivec.end()), ivec.end());
对pair类型的vector排序
vector<pair<int, int>> vii;
sort(vii.begin(), vii.end());
形如上面的代码,sort 排序方式是根据 pair 中 first 的值升序排列(默认)。
对元素都为正整数的vector利用sort默认的升序排列进行降序排列
其实对比使用模板的降序 sort 并没有效率上的提升,只是思维上的开拓。
原理就是把元素都变为相反数—— v[i] 变为 -v[i] ,之后调用 sort(v.begin(), v.end()) 。
但使用的时候反而有些鸡肋,需要将 -v[i] 再变为 v[i] 。因此其适用于特殊情况,如 lc506. 相对名次。
vector<pair<int, int>> vii;
for(int i=0; i<n; i++){vii.push_back(make_pair(-score[i], i));
}
sort(vii.begin(), vii.end());
一维数组转二维数组
主要是通过 emplace_back 直接构造一维数组,加入到二维数组中。
// 将一维数组 original 转为 m 行 n 列的二维数组
vector<vector<int>> construct2DArray(vector<int>& original, int m, int n) {int sizes = original.size();vector<vector<int>> v;if(sizes != m*n) return v;for(auto beg=original.begin(); beg!=original.end(); beg += n){v.emplace_back(beg, beg+n);}return v;
}
size_t和int
for(int i = popped.size() - 1; i >= 0; i--){s_out.push(popped[i]);
}for(size_t i = popped.size() - 1; i >= 0; i--){s_out.push(popped[i]);
}
一直以为 int 和 size_t 没有什么大区别,结果如上所示,第二种写法是错误的,因为 size_t 必须保存 大于等于 0 的数,而 -- 操作会使 i 最终的值 小于0 ,因此运行时会出现错误。
如何不用临时变量交换两个数?
int a = 1;
int b = 2;
/*方法1*/
a = a + b; //新a=原a+原b
b = a - b; //新b=新a-b=原a+原b-原b=原a
a = a - b; //新新a=新a-新b=原a+原b-新b=原a+原b-原a=原b/*方法2 ^ 按位异或 异曲同工*/
a = a ^ b;
b = a ^ b;
a = a ^ b;
将类函数的形参赋值给同名的类成员变量
有这样的代码:
class Solution{int a;
public:void fun(int a){}
};
如果在fun函数内,我想将调用时, 实参a 传给 形参a 的值赋给 类的成员变量a,该怎么办呢?
这就牵扯到了以前提到过的this指针的知识,以前讲过,this指针指向调用当前函数的对象,而 调用fun函数的对象 也就是 Solution的对象 。而我们想要进行的操作也是将 形参a的值 赋给 调用当前函数的对象其成员a ,因此可以这样实现:
void fun(int a){this->a = a;
}