1、在做LeetCode的时候发现sort函数不仅仅可以 使用默认的升序或者降序,还可以自己定义一个cmp函数,或者使用lambda表达式。
sort(points.begin(), points.end(), mySort);
bool mySort(pair<int, int> a, pair<int, int> b){
return a.first < b.first;
}
2、c++ STL 容器 begin() end() front() end()的用法
begin函数
函数原型:
iterator begin();
const_iterator begin();
功能:
返回一个当前vector容器中起始元素的迭代器。
end函数
函数原型:
iterator end();
const_iterator end();
功能:
返回一个当前vector容器中末尾元素的迭代器。
front函数
函数原型:
reference front();
const_reference front();
功能:
返回当前vector容器中起始元素的引用。
back函数
函数原型:
reference back();
const_reference back();
功能:
返回当前vector容器中末尾元素的引用。
例子:
vector<char> v1;
vector<char>::iterator iter2;
iter2 = v1.end()-1; //注意v1.end()指向的是最后一个元素的下一个位置,所以访问最后一个元素
cout << *iter2 << endl;
3、expected unqualified-id before string constant
出现这种提示一般是在哪个地方少了一个“;”
4、const 修饰指针或者被指物
看"effective c++"第三条讲到: 只需要判断const是在 * 的左边还是右边即可。左边则是修饰被指物,即被指物是常量,不可以修改它的值;右边则是修饰指针,即指针是常量,不可以修改它的指向;在左右两边,则被指物和指针都是常量,都不可以修改。
#include<iostream>
using namespace std;
int main(){
int c = 3;
int a = 2;
int b = 1 ;
//const出现在*左边,则被指物是常量
const int * pi = &a;
*pi = b;//不正确 被指物是常量
pi = &c; //正确
//const 出现在* 右边,则指针是常量
int * const p = &a;
p = &c;//不正确,指针是常量
*p = c;//正确
//const出现在*左右两边,则被指物和指针都是常量
const int * const ptr = &a;
ptr = &c;//不正确,指针是常量
*ptr = c;//不正确,被指物是常量
}
5、leetcode N 皇后问题 遇到的 "reference binding to null pointer of type 'value_type' "
总是显示“ reference binding to null pointer of type 'value_type”,简直了!我想半天这result二维数组也没法赋初值啊!查好久!后来才看到是 vector<vector<int>> checkerBoard(n);我已经给checkerBoard手动分配了内存,然后又用了别人代码中的一句话checkerBoard.push_back(vector<int>()); 最后我的循环次数就只有4次,然后又开辟了4个空间,相当于我这个对象中8个对象,4个为空。。结果就引用指向了空值 = = 。。汗
6、【求教】对数组使用基于范围的for循环,出现需要“begin”函数的问题
在广度优先遍历的时候出现的问题, 范围for不能用于指针。
范围for必须用于
1. C风格数组
2. 实现了begin()和end()迭代器方法的容器
while (!Q.empty()) {
GraphNode* temp = Q.front();
Q.pop();
//报错没有begin函数
for (auto i : temp) {
indegree[i->label]--;
if (indegree[i->label]) {
Q.push(i);
}
}
}
//写成了temp,就显示“基于此范围的for语句需要begin函数”,因为不是迭代器,temp 是GraphNode*的指针
//应该是他的领接点temp->neighbors,整好也是vector,有begin和end迭代器