cpp 学习笔记

Vector 遍历

vector<int> v1{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10};

通过数组下标遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
14
for (size_t i = 0; i < v1.size(); i++)
{
cout << v1[i] << "; ";
}
cout << endl;

for (size_t i = 0; i < v1.size(); i++)
{
cout << v1.at(i) << "; ";
}
cout << endl;

2; 3; 4; 5; 6; 7; 8; 9; 10; 10; 10;
1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 10;

通过迭代器遍历

1
2
3
4
5
6
for (vector<int>::iterator iter = v1.begin(); iter != v1.end(); iter++)
{
std::cout << *iter << "; ";
}
cout << endl;
1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 10;

auto 关键字遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
for (auto iter = v1.begin(); iter != v1.end(); iter++)
{
cout << *iter << "; ";
}
cout << endl;

for (auto i : v1)
{
cout << v1[i] << "; ";
}
cout << endl;
1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 10;
1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 10;

for_each 加函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <vector>
#include<algorithm>

using namespace std;

template<typename T>
void printer(const T& val)
{
cout << val << "; ";
}

void main()
{
for_each(v1.cbegin(), v1.cend(), printer<int>);
cout << endl;
}

1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 10;

计时方法 chrono

传统计时方法:

1
2
3
4
5
6
7
#include <ctime>
using namespace std;

clock_t start = clock();
// do something...
clock_t end = clock();
cout << "花费了" << (double)(end - start) / CLOCKS_PER_SEC << "秒" << endl;

此方法可以精确到毫秒,输出样例:花费了0.123秒

C++11 最佳计时方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <chrono>   
using namespace std;
using namespace chrono;

auto start = system_clock::now();
// do something...
auto end = system_clock::now();
auto duration = duration_cast<microseconds>(end - start);
cout << "花费了" << double(duration.count()) * microseconds::period::num / microseconds::period::den << "秒" << endl;

//duration_cast< > 表示类型转换
//microseconds 表示微妙。除此之外,还有五种时间单位:hours, minutes, seconds, milliseconds, nanoseconds
//num 和 den分别表示分子(numerator)和分母(denominator)。在我给出的代码中,num等于1, den等于1,000,000
//count( ) 用来返回时间

Vector 去重

使用场景上来说 vector不便于做删除操作 所以一般vector的删除需要借助别的数据结构。

方法一:使用 set

1
2
3
4
5
void RemoveRepeat1(vector<int>& vec)
{
set<int> setVec(vec.begin(), vec.end());
vec.assign(setVec.begin(), setVec.end());
}

方法二: 使用 sort + unique 函数

1
2
3
4
5
6
7
8
9
10
void RemoveRepeat2(vector<int> &vec)
{
sort(vec.begin(),vec.end());

// unique让所有重复的数都放到最后,返回一个迭代器
// 1 2 3 4 3 就是返回3的迭代器
auto it = unique(vec.begin(), vec.end());

vec.erase(it, vec.end());
}

map 插入数据的方法

在构造map容器后,我们就可以往里面插入数据了。这里有三种插入数据的方法:

方法一: 用 insert 函数插入 pair 数据

1
2
map<int, string> mapStudent;
mapStudent.insert(pair<int, string>(1,“student_one”));

方法二: 用 insert 函数插入 value_type 数据

1
2
map<int, string> mapStudent;
mapStudent.insert(map<int, string>::value_type (1,"student_one"));

方法三: 用 make_pair

1
mapStudent.insert(make_pair(1, "student_one"));

方法四: 用数组方式插入数据

1
2
3
4
5
6
7
8
9
map<int, string> mapStudent;
mapStudent[1] = “student_one”;
mapStudent[2] = “student_two”;

// or

map<string, int> mapStudent;
string s;
m[s]++;

注: insert 函数插入数据,在数据的插入上,涉及到集合的唯一性这个概念,即当 map 中有这个关键字时,insert 操作是不能再插入这个数据的,但是用数组方式就不同了,它可以覆盖以前该关键字对应的值。

PS:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <map>
#include <algorithm>

using namespace std;

int main()
{
map<int, string> m;
m.insert(pair<int, string>(1, "a"));
m.insert(make_pair(2, "b"));
m.insert(map<int, string>::value_type(3, "c"));

for_each(m.cbegin(), m.cend(), [](const pair<int, string> &it)
{
cout << "first:" << it.first << " second:" << it.second << endl;
});
return 0;
}
// lambda 中的参数列表要写成 pair 类型,因为 map 返回的是一对数据,是 pair 型的,不可只用 map<int,string>::iterator it 迭代器来遍历。

那些年我们总会遇到的坑

curl

1
2
CurlCXX curl(url, 1); //1s timeout
curl.post(body);
  • 注意学会curl发包的用法,并且post时,body当中要注意fastcgi框架当中约定了post数据格式为x-www-form-urlencoded/form-data,因此一定要注意body里面的数据,单个字段内不能出现容易导致解析错误的'&'字符,若不得不包含'&'字符,则要用转义字符'\&'包起来,否则会导致参数错误。

const

1
2
3
const CallRecord *app;
app = app_ptr();
const_cast<CallRecord *>(app)->reload_cache();
  • 注意对const类型的对象操作时,需要用const_cast<XXXXXX>对该对象进行强制类型转换。