zoukankan      html  css  js  c++  java
  • C++编程技巧(长期更新)

    1.数组使用

    int* p = new int[5](); // 数组新建并全部初始化为0
    等价于:
    int* p;
    p = new int[5]();
    int* q = new int[5];   // array elements all have indeterminate value
    2.队列的使用。STL模板中,queue只能在读q.front();q.back();必须要要配合pop()函数才能读完所有的队列内容。
    而deque模板的使用,可以访问到任意位置的数据,读取方法,可以是q.[i],也可以是q.at(i),注意要从0开始读,所以for循环写的时候,要这样子写:
    加上头文件:#include <queue>
    for(int i = 0;i < q.size();++i)  
            cout << "q[" << i << "] : " << q[i] << endl;  
        cout << endl;  

     还有将一个结构体变量放进队列的时候内存泄漏是个很大的问题。在结构体里面谨慎的使用指针,看下面的一个例子。

    定义了一个结构体变量:

    struct MyStruct
    {
        Mat irdata;
        Mat depthdata;
        float *array;
    };

    其中包含了两个mat矩阵。和一个float矩阵的指针。

    在调用的时候千万要注意,

    #include "que-mat.h"
    
    using namespace cv;
    using namespace std;
    int cnt = 0;
    int k = 0;
    int p, q;
    MyStruct s_copy;
    std::deque<MyStruct> qe;
    MyStruct s1;
    MyStruct s2;
    bool matqueue(Mat inputdata1, Mat inputdata2, float *array1)
    {
        cnt++;
        //s1.array = new float[20]{};
        //插入队尾
        s1.irdata = inputdata1;//调用问题,这里因为指向了同一个内存,所以必须clone()一下。
    s1.depthdata
    = inputdata2; s1.array = array1;//调用问题,该指针一直指向了同一片内存空间,所以会被不停的刷掉,所以永远只有最后一个数据失是正确的,其他存储数据都是乱码
    qe.push_back(s1);
    int n = qe.size(); if (qe.size() > 10) qe.pop_front(); cout << "队列大小 " << n << endl; s_copy = qe.back(); if ((s_copy.array[1] == 1) || (s_copy.array[1] == 2)){ // if (n == 10){ for (int j = 0; j < 10; j++){ k++; //s_copy.array = new float[20]{}; s2 = qe.back(); cout << "队列大小 " << qe.size() << "s2.array " << s2.array[0] << endl; save_image(s2.irdata, s2.depthdata, 224, 171, k); save_txt(s2.array, k); //队首出栈 qe.pop_back(); } } if (cnt == 80){ waitKey(0); } // 判断队列是否为空 if (qe.empty()){ std::cout << "Enpty" << std::endl; return 0; } return 1; }
    问题已经指出来了,然后怎么写呢,
    s1.irdata = inputdata1.clone();
    s1.depthdata = inputdata2.clone();
    //申请一个空间,再memset进去
    s1.array=(float*)malloc(20*sizeof(float));
    
    memset(s1.array,&array,80);//将数据填充进去
    qe.push_back(s1);

     关于内存机制,需要不断的学习,修改后的代码还有一个问题,就是为调用迅速将文件中参数引用也发生了修改

    bool inque_mat(const Mat &inputdata1, const Mat &inputdata2, GestureInfo gestureInfo);

    const Mat &inputdata1。这样子调用比较稳定。

     
  • 相关阅读:
    利用栈实现字符串中三种括号的匹配问题c++语言实现
    十进制数转N进制c++实现
    字符单链表识别数字,字母,其它字符,并分为三个循环链表的算法c++实现
    c++两数组合并算法
    c++顺序表(数组)查找最大最小值
    SSO单点登录、跨域重定向、跨域设置Cookie、京东单点登录实例分析
    php实现单点登录,顶级域名与子域名间共享Cookie实现单点登录原理
    php实现单点登录实例
    php实现SSO单点登录实例
    玩转音频、视频的利器:FFmpeg
  • 原文地址:https://www.cnblogs.com/Anita9002/p/6201981.html
Copyright © 2011-2022 走看看