1 . pair<T,T> 返回两个值
代码语言:javascript复制//返回两个值的情况
pair<vector<double>,int> R_R(Mat& img)
{
int n=img.rows;
vector<double> a;
unsigned int m=img.cols;
unsigned int k=img.rows;
for(unsigned int i=0;i<m;i )
{
for(unsigned int j=0;j<k;j )
{
a.push_back(img.at<double>(i,j));
}
}
pair<vector<double>,int> data = std::make_pair(a,n);
return data;
}
int main()
{
Mat img=imread("./1.png");
pair<vector<double>,int> m_m=R_R(img);
auto m_m=R_R(img);
cout<<m_m.first[100]<<" "<<m_m.second<<endl;
//或者定义如下接收函数值
vector<double> m;
int k;
std::tie(m,k)=m_m=R_R(img);
cout<<m[100]<<" "<<k<<endl;
return 0;
}
补充pair
代码语言:javascript复制//1
vector<pair<int,double>> a;
a.push_back(make_pair(i,j));
cout<<a[i].first<<" "<<a[i].second<<endl;
//定义
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;
//创建与初始化
pair<string, string> ob; // 创建一个空对象ob,两个元素类型都是string
pair<string, int> a; // 创建一个空对象 a, 两个元素类型分别是string和int类型
pair<string, vector<int> > b; // 创建一个空对象b,两个元素类型分别是string和vector类型
//排序
//默认
pair<int,int>Item[n]; //定义pair对象数组Item[n]
sort(Item, Item n); //默认对Item的first的值进行排序
//自定义函数
bool cmp(pair<int, int>a, pair<int, int>b)
{
return a.first<b.first; //根据fisrt的值升序排序
}
bool cmp(pair<int, int>a, pair<int, int>b)
{
return a.second>b.second;//根据second的值升序排序
}
sort(Item, Item n, cmp);// 按照自定义的顺序进行排序
//自定义pair类型
typedef pair<int, int>P;
2 . tuple<T, T , T, ....> 返回两个及以上
代码语言:javascript复制#include <tuple>
//返回多个值的情况,
std::tuple<Mat , int,Point , vector<double> > foo(Mat& img)
{
Mat A=img;
int a=img.cols;
Point B=Point(img.cols,img.rows);
vector<double> b;
unsigned int m=img.cols;
unsigned int n=img.rows;
for(unsigned int i=0;i<m;i )
{
for(unsigned int j=0;j<n;j )
{
b.push_back(img.at<double>(i,j));
}
}
return std::make_tuple(A, a,B,b);
}
int main()
{
Mat img=imread("./1.png");
std::tuple<Mat , int,Point , vector<double> > ss= foo(img);
auto ss=foo(img);
cout<<get<1>(ss)<<" "<<get<2>(ss).x<<" "<<get<3>(ss)[100]<<endl;
//或者返回如下定义
Mat A; int a; Point B; vector<double> b;
tie(A,a,B,b)=foo(img);
cout<<a<<" "<<B.x<<" "<<B.y<<endl;
return 0;
}
补充tuple
代码语言:javascript复制tuple(int,string) foo();
tie(a,b)=foo();
b.c_str();
//返回元素个数
std::tuple<int, double, std::string> t(64, 128.0, "Caroline");
std::tuple<std::string, std::string, int> t2 =
std::make_tuple("Caroline", "Wendy", 1992)
size_t num = std::tuple_size<decltype(t)>::value;
std::cout << "num = " << num << std::endl;
//获取第1个值的元素类型
std::tuple_element<1, decltype(t)>::type cnt = std::get<1>(t);
std::cout << "cnt = " << cnt << std::endl;
//比较
std::tuple<int, int> ti(24, 48);
std::tuple<double, double> td(28.0, 56.0);
bool b = (ti < td);
std::cout << "b = " << b << std::endl;
3. 结构体
代码语言:javascript复制struct Rect_Img
{
Mat A;
int a;
Point B;
vector<double> b;
};
Rect_Img Mul;
Rect_Img mul_R(Mat img)
{
Mul.A=img;
Mul.a=img.rows;
Mul.B=Point(img.cols,img.rows);
unsigned int m=img.cols;
unsigned int n=img.rows;
for(unsigned int i=0;i<m;i )
{
for(unsigned int j=0;j<n;j )
{
Mul.b.push_back(img.at<double>(i,j));
}
}
return Mul;
}
int main()
{
Mat img=imread("./1.png");
Rect_Img mull=mul_R(img);
cout<<mull.a<<" "<<mull.B.x<<" "<<mull.B.y<<endl;
return 0;
}
4. 引用
代码语言:javascript复制void Mul_R(Mat& A,int& a,Point& B ,vector<double>& b,Mat& img)
{
A=img;
a=img.rows;
B=Point(img.cols,img.rows);
unsigned int m=img.cols;
unsigned int n=img.rows;
for(unsigned int i=0;i<m;i )
{
for(unsigned int j=0;j<n;j )
{
b.push_back(img.at<double>(i,j));
}
}
}
int main()
{
Mat A;int a;Point B ;vector<double> b;
Mul_R( A, a,B , b,img);
cout<<a<<" "<<B.x<<" "<<B.y<<endl;
return 0;
}
博主:菜鸟程序员
初衷:学习资料,程序设计,视觉算法,求职经验,工作心得