c++学习笔记

很多东西用了就忘,写在这儿不时复习一下。
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 数学库

c++数学库

1)计算斜边长度

// 计算斜边长度
 double hypot(double x, double y);

2)数字取整

  • 向上取整ceile;
  • 向下取整floor;
  • 取余fmod
  • 截断(返回幅值不大于输入的整数)trunc
  • 四舍五入取整
    在这里插入图片描述

参考链接

c++官方主页

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值