很多东西用了就忘,写在这儿不时复习一下。
c++官方主页镇楼!
1.C++常用特性
1.0 宏定义
// 定义两数之间的最大值的宏
#define MAX(A,B) ( (A)>(B) ? (A):(B) )
// 三个数中的最大值的宏
#define MAX(A,B,C) ( ((A)>(B) ? (A):(B))>C?((A)>(B) ? (A):(B)):C)
// 两数相加宏
#define ADD(A,B) ((A)+(B))
// 两数相乘宏
#define MULTIPLY(A,B) ((A)*(B))
// 两数交换宏
#define SWAP(a,b) {a^=b;b^=a;a^=b;}
#define SWAP2(a,b) {a+=b; b=a-b; a=a-b;}
1.1类与结构体
// 1-结构体定义
typedef struct Student{
int id;
string name;
int age;
//...
}stud;
// 2-类的构造
class Rectangle {
int width,height;
public:
Rectangle(int,int);
int area() {return width*height;}
};
// 默认构造
Rectangle::Rectangle (int x, int y) { width=x; height=y; }
//或者
Rectangle::Rectangle (int x, int y) : width(x), height(y) { }
// 3- 给类型取别名
typedef vector<vector<double>> vector2d;
1.2 for each & auto自动推断类型
template<typename T>
vector<T> vecs;
/** 矢量容器循环的几种方法 **/
// 最朴实的方法〇
for(size_t i=0;i<vecs.size();++i){
T vec=vecs[i];
}
// 方法一
for each(auto ele in vecs){
}
// 方法二
for each(auto &ele:vecs){
T vec=*iter;
}
// 方法三:迭代器
for(vector<T>::iterator iter=vecs.begin();iter<vecs.end();++iter){
T vec=*iter;
}
// 或者用while循环
// 举个栗子
//(1)定义结构体Point3d类型,包含x,y,r三个变量;以及用于存储以该类型为模板的矢量容器obst_pos。
struct Point3d
{
int x;
int y;
int r;
}Pts3d;
//(2)从obst_pos中获取数据存储到其他变量中去
//auto给ele自动设置变量类型。
vector<Point3d> obst_pos;
for each(auto ele in obst_pos)
{
xtemp = ele.x;
ytemp = ele.y;
rtemp = ele.r;
newobstacle(infos, idCount, "0", xtemp, ytemp, rtemp);
idCount++;
}
//或者
vector<Point3d> obst_pos;
for each(auto &ele :obst_pos)
{
xtemp = ele.x;
ytemp = ele.y;
rtemp = ele.r;
newobstacle(infos, idCount, "0", xtemp, ytemp, rtemp);
idCount++;
}
// for_each
//https://blog.csdn.net/wbzhang233/article/details/104618912
void myfunction (int i) { // function:
std::cout << ' ' << i;
}
for_each (myvector.begin(), myvector.end(), myfunction);
1.3 c++计时
double start=(double) getTickCount();
//...
double end =getTickCount();
cout<<"Time:"<<(double) (end-start)/getTickFrequency()<<endl;
1.4 opencv mat的type属性
1.5 随机取下标子集数组
在优化算法里常用到。比如存在0-N个粒子,随机从中取出M(M<N)个不重复粒子构成的子集。以下仅生成下标子集数组。
另外其实可以使用alrogithm库中的shuffle函数随机重排,然后取前若干个元素
#include <cstilib> // for rand() && srand()
/// 随机取下标子集数组
unordered_set<int> getRandomIndex(int maxNum,int num){
unordered_set<int> result;
while(result.size()<num){
int ind = rand()%maxNum;
if( result.find(ind)==result.end() ){
result.insert(ind);
}
}
return result;
}
1.6 输入流
cin和scanf
参考:c++键盘输入数字和字符
以下代码接收待输入数组的长度n和数组中的每个数字。
int n;
cin>>n;
// 1
vector<int> nums;
for(int i = 0; i < n; i++){
int x; scanf("%d",&x);
nums.push_back(x);
}
// 2
int nums[a];
for(int i=0;i<a;i++){
cin>>nums[i];
}
读取一个字符;
char a;
char b;
a=cin.get();
cin.get(b);
cout<<a<<b<<endl;
2.STL库
vector、map、set、sort类型的使用,还有list和string。如下所示:
2.1 vector
// 1- vector初始化
vector<int> nums2(nums1.begin(),nums1.end());
2.2 map
// map类型 :map<typename _TA,typename _TB> map1;
map<int,int> hist;
// 用pair作为map的成员进行插入
pair<int,int>
// 重要成员函数find
/** 枚举类型 **/
enum FeatureType{
_SIFT=0,
_ORB=1,
_SURF=2
//...
};
2.3 pair
其标准库类型–pair类型定义在#include的<utility>头文件中,定义如下:
类模板:template<class T1,class T2> struct pair
// 1-创建与初始化
pair<T1, T2> p1; //创建一个空的pair对象(使用默认构造),它的两个元素分别是T1和T2类型,采用值初始化。
pair<T1, T2> p1(v1, v2); //创建一个pair对象,它的两个元素分别是T1和T2类型,其中first成员初始化为v1,second成员初始化为v2。
make_pair(v1, v2); // 以v1和v2的值创建一个新的pair对象,其元素类型分别是v1和v2的类型。
p1 < p2; // 两个pair对象间的小于运算,其定义遵循字典次序:如 p1.first < p2.first 或者 !(p2.first < p1.first) && (p1.second < p2.second) 则返回true。
p1 == p2; // 如果两个对象的first和second依次相等,则这两个对象相等;该运算使用元素的==操作符。
p1.first; // 返回对象p1中名为first的公有数据成员
p1.second; // 返回对象p1中名为second的公有数据成员
// 2-创建pair对象
pair<string, string> anon("st","sg"); // 创建一个对象anon,两个元素类型都是string
pair<string, int> word_count("ssg",1); // 创建一个对象 word_count, 两个元素类型分别是string和int类型
pair<string, vector<int> > line; // 创建一个空对象line,两个元素类型分别是string和vector类型
当输出为pair时,可以使用tie来接收。
std::pair<std::string, int> getPreson() {
return std::make_pair("Sven", 25);
}
int main(int argc, char **argv) {
std::string name;
int ages;
std::tie(name, ages) = getPreson();
std::cout << "name: " << name << ", ages: " << ages << std::endl;
return 0;
}
2.4 deque
双端队列:deque是具有动态大小的序列容器,可以在两端(前端或后端)扩展或收缩。
deque使用
2.5 set
3 数学库
1)计算斜边长度
// 计算斜边长度
double hypot(double x, double y);
2)数字取整
- 向上取整ceile;
- 向下取整floor;
- 取余fmod
- 截断(返回幅值不大于输入的整数)trunc
- 四舍五入取整