文章目錄
- ++和--
- 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;
}