C++中pair的具体用法

来源:互联网 发布:淘宝男鞋店推荐 编辑:程序博客网 时间:2024/06/05 19:22

pair的类型

    pair 是 一种模版类型。每个pair 可以存储两个值。这两种值无限制。也可以将自己写的struct的对象放进去。。

    pair<string,int> p;

    pair<int ,int > p;

   pair<double,int> p;

  都可以。。。  

   应用:如果一个函数有两个返回值 的话,如果是相同类型,就可以用数组返回,如果是不同类型,就可以自己写个struct ,但为了方便就可以使用 c++  自带的pair ,返回一个pair,其中带有两个值。除了返回值的应用,在一个对象有多个属性的时候 ,一般自己写一个struct ,如果就是两个属性的话,就可以用pair 进行操作。。。

    应用pair 可以省的自己写一个struct 。。。如果有三个属性的话,其实也是可以用的pair 的 ,极端的写法 pair <int ,pair<int ,int > >

写法极端。(后边的两个 > > 要有空格,否则就会是 >>  位移运算符)

makr_pair:

   pair<int ,int >p (5,6);

   pair<int ,int > p1= make_pair(5,6);

   pair<string,double> p2 ("aa",5.0);

   pair <string ,double> p3 = make_pair("aa",5.0);

有这两种写法来生成一个pair。


 如何取得pair的值呢。。

 每个pair 都有两个属性值  first  和second

 cout<<p1.first<<p1.second; 

 注意是属性值而不是方法。



[cpp] view plain copy
  1. template <class T1, class T2> struct pair  
  2. {  
  3.   typedef T1 first_type;  
  4.   typedef T2 second_type;  
  5.   
  6.   T1 first;  
  7.   T2 second;  
  8.   pair() : first(T1()), second(T2()) {}  
  9.   pair(const T1& x, const T2& y) : first(x), second(y) {}  
  10.   template <class U, class V>  
  11.     pair (const pair<U,V> &p) : first(p.first), second(p.second) { }  
  12. }  

(补充:以下是网上搜的)

由于pair类型的使用比较繁琐,因为如果要定义多个形同的pair类型的时候,可以时候typedef简化声明:

typedef pair<string, string> author;

author pro("May", "Lily");

author joye("James", "Joyce");

受以上的启发在写代码过程中觉得

typedef vector<int>sun;
vector<sun>q;
vector<int>b;
for(int i = 0; i < 5; i++)
{
b.push_back(i);
}
q.push_back(b);

实则相当于两个vector的操作

opencv回调函数中鼠标响应cvSetMouseCallback函数,绘制矩形

首先是回调函数:

(摘自百度百科)回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。 
机制如下:

  • 定义一个回调函数
  • 提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者
  • 当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理

这么做的意义就在于可以把调用者和被调用者分开。它只需知道存在一个具有特定原型和限制条件的被调用函数。简而言之,回调函数就是允许用户把需要调用的方法的指针作为参数传递给一个函数,以便该函数在处理相似事件的时候可以灵活的使用不同的方法。

接下来就是opencv中cvSetMouseCallback的理解和应用:

void cvSetMouseCallback(const char* window_name, CvMouseCallback on_mouse, void* param=NULL ); 
window_name 回调函数需要注册到的 窗口名字,即产生事件的窗口。 
on_mouse 指定窗口里每次鼠标事件发生的时候,被调用的函数指针,回调函数。 
第三个参数用来传递额外的信息给前面提到的void* param。 
这个函数的原型应该为 void Foo(int event, int x, int y, int flags, void* param); 
其中 
event是 CV_EVENT_*变量之一, x和y是鼠标指针在图像坐标系的坐标(不是窗口坐标系), 
flags是CV_EVENT_FLAG的组合,param是用户定义的传递到cvSetMouseCallback函数调用的参数。 
param 用户定义的传递到回调函数的参数。 
放代码

#include <algorithm>#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>using namespace std;using namespace cv;float xMin,yMin,width,height;CvRect ROI_rect;int kick_state=0;CvPoint p1,p2;void on_MouseHandle(int event,int x,int y,int flags, void* param){    Mat* frame=(Mat*)param;//将参数传递给内部的变量,并使用。    if(event==CV_EVENT_LBUTTONDOWN)    {        cout<<"左键被按下"<<endl;        ROI_rect.x=x;        ROI_rect.y=y;        kick_state=true;    }    else if(event==CV_EVENT_MOUSEMOVE&&kick_state)    {        cout<<"鼠标在移动"<<endl;        p1=cvPoint(ROI_rect.x,ROI_rect.y);        p2=cvPoint(x,y);    }    else if(event==CV_EVENT_LBUTTONUP&&kick_state)    {        cout<<"左键被抬起"<<endl;        xMin=cv::min(p1.x,p2.x);        yMin=cv::min(p1.y,p2.y);        width=abs(p2.x-p1.x);        height=abs(p2.y-p1.y);        rectangle(*frame,Point(xMin,yMin),Point(xMin+width,yMin+height),Scalar(0,255,0),2,8,0);        imshow("Image",*frame);        kick_state=false;    }}int main(){    Mat frame;    Mat* pframe=&frame;    frame=imread("path",1);    imshow("image",frame);    waitKey(1);//这一步最好加上,有时候会因为没有等待,图片无法正常显示    setMouseCallback("Image",on_MouseHandle,(void*)pframe);//这里,我将第三个参数,即传递到回调函数中的参数,定义为一帧图片,也就是将读入的图片传给回调函数,让它能够在函数内部使用。实际上也可以什么都不传入,把frame定义成全局变量。这样回调函数也可以使用。    waitKey(0);}

原创粉丝点击