Vector
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| #include<vector> vector<int> a,b; vector<int> a(10)
vector<>::reverse_iterator i;
begin(),end(),rbegin(),rend();
a.assign(b.begin(),b.begin()+3); a.assign(4,2);
a.back(); a.front(); a[i]; a.clear(); a.empty(); a.pop_back();
a.erase(a.begin()+1,a.begin()+3); a.push_back(); a.emplace_back();
a.insert(a.begin()+1,5); a.insert(a.begin()+1,3,5); a.inse3rt(a.begin()+1,b+3,b+6);
a.size();a.capacity();
a.resize(10); a.resize(10,2); a.reserve(100);
a.swap(b);
a==b; return vector<int>(a.begin(), a.begin()+k) ; 我们可以通过这个语句 来返回数组的 前k项
|
注意
vector 没有length() 函数
==vector 只能push_back 和 pop_back 从头插入 使用insert(a.begin(), value)==
==所有的STL返回整型 全部都是 unsigned long 我们需要在前面加括号 用int型接收它们==
size 和 capicity 大部分时候不需要关注
==在你直接初始化一个二维数组时 你可以使用memset 也可以这样==
==vector<vector<int>> (5, vector<int>(6,1))
显然 这里用了套娃的属性==
少使用push_back() 要使用emplace_back();
**vector<pair <int, int> > 或者 vector<vector<int,int> > 在用sort比较时 会先比较first 如果first相同,再比较second **
- 关于
pair
- Pair 定义有序对 是结构体 调用使用
.first
和 .second
比较时也是先比较first 再比较second
String
1 2 3 4 5 6 7 8 9 10 11 12
| #include <cstring> == #include <string.h>
char* char[]
string a, b
a.compare(b);
a.find(b);
a.substr(3, 2) a.substr(2)
|
注意string::npos的使用
Hash table
Priority_queue
自实现heap
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| class min_heap { public: min_heap() { nums.emplace_back(nullhead); } void Insert(int val) { nums.emplace_back(val); Shift_up((int)nums.size() - 1); } void Shift_up(int index) { while (index / 2) { if (nums[index/2] > nums[index]) swap(nums[index], nums[index/2]); index /= 2; } } int heap_top() { return this->nums[1]; } void heap_delete(int index) { if (nums.size() == 1) { cout << "ERROR"; return; } nums.erase(nums.begin() + 1 + index); heap_sort(); } void heap_sort() { int index = (int)nums.size() - 1; while (index > 1) { Shift_up(index); index --; } } void heap_print() { for (int i = 1; i < nums.size(); ++i) { cout << nums[i] << " "; } cout << endl; } private: vector<int> nums; };
|
要点:
- 上浮「shift_up」操作的关键在于 我们取1开始 两个孩子分别是 2i 和 2i+1 它们俩除2 可以同时到达双亲节点
- 我们把上浮定义成 可以指定任何一个下标 上浮。 这样的好处是 之后的 heap_sort 以及 Insert 函数 都很方便写了 「heapsort就是把每个元素都上浮,insert就是加到末尾然后上浮」
- 要注意的是 下标从1 开始 返回top的时候不要用front!
⚠️ 优先队列是一种数据结构 但堆不是 堆是优先队列的内部实现方式
普通方法
priority_queue<int> q;//等价于默认,从大到小排
priority_queue<int, vector<int>, less<int>> q;//等价于默认,从大到小排
priority_queue<int, vector<int>, greater<int>> q; //通过操作,按照元素从小到大的顺序出队
- priority_queue<TreeNode*, vector<TreeNode*>, decltype(cmp)> q{cmp};
自定义优先级
1 2 3 4 5 6 7 8 9 10 11 12 13
| struct cmp { bool operator ()(int a, int b) { return a > b; } }; priority_queue<int, vector<int>, cmp > q;
auto cmp = [](const TreeNode* a, const TreeNode* b) { return a->val > b->val; }; priority_queue<TreeNode*, vector<TreeNode*>, decltype(cmp)> q{cmp};
|
自定义结构体、优先级
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| struct node { int priority; int value; friend bool operator < (const node &a, const node &b) { return a.priority < b.priority; }
};
priority_queue<node> q;
|
因为标准库默认使用元素类型的 <
操作符来确定它们之间的优先级关系。而且自定义类型的 <
操作符与 >
操作符并无直接联系,故会编译不过。
错误示范:
1 2 3 4 5 6 7
| struct node { int priority; int value; friend bool operator > (const node &a, const node &b) { return a.priority > b.priority; } };
|
decltype关键字 ( C++11 )
decltype,在C++中,作为操作符,用于查询表达式的数据类型.
有时我们希望从表达式的**类型推断**出要定义的**变量类型**,但是不想用该表达式的值初始化变量 ( 如果要初始化就用auto了 )。为了满足这一需求,C++11新标准引入了decltype类型说明符,它的作用是**选择并返回操作数的数据类型**,在此过程中,编译器**分析**表达式并得到它的类型,却**不实际计算**表达式的值。
基本用法
1 2 3 4 5 6 7 8 9 10
| int getSize(); int main() { int tempA = 2; decltype(tempA) dclTempA; decltype(getSize()) dclTempB; return 0; }
|
与 const 结合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| double tempA = 3.0; const double ctempA = 5.0; const double ctempB = 6.0; const double *const cptrTempA = &ctempA;
decltype(ctempA) dclTempA = 4.1;
dclTempA = 5;
decltype(cptrTempA) dclTempB = &ctempA;
cout<<sizeof(dclTempB)<<" "<<*dclTempB<<endl;
dclTempB = &ctempB;
*dclTempB = 7.0;
|
与引用结合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| int tempA = 0, &refTempA = tempA;
decltype(refTempA) dclTempA = tempA;
decltype(refTempA) dclTempB = 0;
decltype(refTempA) dclTempC;
decltype((tempA)) dclTempD = tempA;
const int ctempA = 1, &crefTempA = ctempA;
decltype(crefTempA) dclTempE = tempA;
decltype(crefTempA) dclTempF = ctempA;
decltype(crefTempA) dclTempG = 0;
decltype(crefTempA) dclTempH;
decltype((ctempA)) dclTempI = ctempA;
|
与指针结合
1 2 3 4 5 6
| int tempA = 2; int *ptrTempA = &tempA;
decltype(ptrTempA) dclTempA;
decltype(*ptrTempA) dclTempB;
|
decltype 总结
decltype和auto都可以用来推断类型,但是二者有几处明显的差异:
1.auto
忽略顶层const
,decltype
保留顶层 const
;
2.对引用操作,auto
推断出原有类型,decltype
推断出引用;
3.对解引用操作,auto
推断出原有类型,decltype
推断出引用;
4.auto
推断时会实际执行,decltype
不会执行,只做分析。
总之在使用中过程中和const
、引用和指针结合时需要特别小心。
Lambda 与 decltype 结合
1 2 3 4 5
| vector<int> counts(26, 0); auto cmp = [&](const char& letter1, const char& letter2) { return counts[letter1 - 'a'] < counts[letter2 - 'a']; }; priority_queue<char, vector<char>, decltype(cmp)> qu{cmp};
|