20140401 cudaHOG代码

1、cudaHOG代码(删减没有必要的目录)

cudaHOGDetect需要boost库:boost_date_time-vc100-mt-1_40.lib

  • VC++目录->附加库目录D:\boost\boost_1_40_0\stage\lib
  • C\C++目录->常规->D:\boost\boost_1_40_0\include\boost-1_40\

2、STL基本

  • 包含一些列排序搜索算法
  • 调试安全、跨平台
  • 模板:类的宏,也甜饼切割机(cookie cutter),泛型(generic).
  • 类模板:泛型类。函数模板:泛型函数
  • STL标准模板库:一些聪明人写的一系列模板。包括链表,堆栈,队列,列表和排序查找等常用的算法
  • 容器:可容纳一些数据的模板类(分为顺序和关联)。STL中有vector,set,map,multiple,deque等容器
  • 向量(vector):基本数组模板,这是一个容器
  • 游标(Iterator):是一个指针,指向STL容器中的元素,也可以指向其他元素

3、vector向量例子

以下代码户主要是利用游标(iterator,类似于指针)数组的形式去改变向量中元素的值

#include<iostream>
#include<vector>
using namespace std;

void print(vector<int>);

int main()
{
    vector<int > vec;
    vec.push_back(34);
    vec.push_back(23);
    print(vec);
    vector<int>::iterator p;
    p=vec.begin();
    *p=68;
    *(p+1)=69;
    //*(p+2)=70;
    print(vec);
    vec.push_back(101);
    vec.push_back(102);
    int i=0;
    while(i<vec.size())
        cout<<vec[i++]<<" ";
    cout<<endl;
    vec[0]=1000;
    vec[1]=1001;
    vec[2]=1002;
    //vec[3]=1002;
    i=0;
    while(i<vec.size())
        cout<<vec[i++]<<" ";
    print(vec);
    return 0;
}

void print(vector<int> v)
{
    cout<<"\n vector size is: "<<v.size()<<endl;
    vector<int>::iterator p =v.begin();

}

 

以下代码主要是利用vector求和

  • vector 的reserve增加了vector的capacity,但是它的size没有改变!而resize改变了vector的capacity同时也增加了它的size!
  • vector<int>::iterator p2=v1[0];这两句都是错的,这就是与指针的区别http://www.cnblogs.com/qlee/archive/2011/05/16/2048026.html
    vector<int>::iterator p2=&(v1[0]);这两句都是错的,这就是与指针的区别
#include<iostream>
#include<vector>
using namespace std;
int sum(vector<int> vec)
{
    int result =0;
    vector<int>::iterator p=vec.begin();
    while(p!=vec.end())
        result+=*p++;
    return result;
}

int main()
{
    vector<int> v1(100);  //定义一个包含一百个元素的向量,自动初始化为0
    cout<<v1.size()<<endl;        //100
    cout<<sum(v1)<<endl;        //0
    v1.push_back (23);
    cout<<v1.size()<<endl; //101
    cout<<sum(v1)<<endl;  //23
    v1.resize(1000);   //v1.reserve(1000);
    v1[900]=900;
    cout<<v1[900]<<endl;//900
    cout<<v1.front()<<endl;//0
    cout<<v1.back()<<endl;//23
    v1.pop_back();
    cout<<v1.back()<<endl;//0
    //vector<int>::iterator p2=v1[0];这两句都是错的
    //vector<int>::iterator p2=&(v1[0]);这两句都是错的
    return 0;
    
}

以下代码是浅拷贝出错,导致两次析构同一块内存问题:深拷贝会开辟新的空间,浅拷贝不会

#include<iostream>
#include<cstdlib>//cstdlib是C++里面的一个常用函数库, 等价于C中的<stdlib.h>
#include<vector>
using namespace std;
class  CDemo
{
public:
    CDemo():str(NULL){};
    ~CDemo()
    {
        if(str) //delete[] str;
        {
            static int i=0;
            cout<<"&CDemo"<<i++<<"="<<(int *)this<<",    str"<<(int *)str<<endl;
            delete[] str;
        }
    }
    char *str;
};

int main(int argc, char ** argv)
{
    CDemo dl;
    dl.str=new char[32];
    strcpy(dl.str,"trend micro");

    vector<CDemo> *al=new vector<CDemo>();
    al->push_back(dl);
    delete al;//第一次释放
    return EXIT_SUCCESS;//退出时第二次释放
}
image

解决方法是:在CDemo类中添加一个深拷贝构造函数

CDemo(const CDemo &cd)
{
    this->str = new char[strlen(cd.str)+1];
    strcpy(str,cd,str);
}
posted @ 2014-04-01 15:39  yexuannan  阅读(757)  评论(0编辑  收藏  举报