[英]searching inside vector member of struct vector
I have a struct like this: 我有一个这样的结构:
enum crdType { CARTESIAN =0, SPHERICAL, CUSTOM1, CUSTOM2, .......};
struct customCRD {
std::vector<coordinate> Corners;
crdType type;
};
then I defined a vector < customCRD >, let's call it vec_customCRD. 然后我定义了一个向量<customCRD>,我们称它为vec_customCRD。
I want to check if my coordinate is inside this vector or not. 我想检查我的坐标是否在此向量内。 I am able to check if specific type is available: 我可以检查特定类型是否可用:
vector < customCRD >::iterator iter = std::find_if(vec_customCRD.begin(), vec_customCRD.end(), boost::bind(&customCRD::type, _1) == CUSTOM1);
it is kind of searching a coordinate, here, inside a vector of vector. 这是在向量的向量内搜索坐标的一种。
any smart way? 有什么聪明的方法吗?
EDIT I forgot to mention that I cannot use C++11. 编辑我忘了提到我不能使用C ++ 11。 and boost version higher than 1.56 升压版本高于1.56
I want to do following code: 我想执行以下代码:
coordinate a; // coordinate is a class of coordinates
std::vector<coordinate> vecCrd;
vector < coordinate >::iterator Corditer;
for(vector < customCRD >::iterator iter = vec_customCRD.begin(); iter != vec_customCRD.end();iter++)
{
vecCrd = iter->Corners;
Corditer = std::find(vecCrd.begin(), vecCrd.end(), a);
if(Corditer != vecCrd.end())
{
std::cout << "yes, this is what I want" << std::endl;
break;
}
}
If you want to use Boost Range you could write things like 如果您想使用Boost Range,可以编写如下内容
int main() {
std::vector<customCRD> const v;
std::cout << "{9,10} found: " << !boost::empty(v | filtered(customCRD::havingCorner(coordinate(9,10)))) << "\n";
std::cout << "{3,5} found: " << !boost::empty(v | filtered(customCRD::havingCorner(coordinate(3, 5)))) << "\n";
};
With the predicate defined as: 谓词定义为:
struct customCRD {
std::vector<coordinate> Corners;
crdType type;
struct havingCorner {
coordinate _a;
havingCorner(coordinate a) : _a(a) {}
bool operator()(customCRD const& cc) const { return cc.Corners.end()!=std::find(cc.Corners.begin(), cc.Corners.end(), _a); }
};
};
See it Live On Coliru (c++11 with data) 观看Live On Coliru (带有数据的c ++ 11)
See it Live On Coliru (c++03) 在Coliru上实时观看 (c ++ 03)
#include <boost/range.hpp>
#include <boost/range/adaptors.hpp>
#include <boost/range/algorithm.hpp>
using namespace boost::adaptors;
#include <iostream>
enum crdType { CARTESIAN =0, SPHERICAL, CUSTOM1, CUSTOM2 };
typedef std::pair<int,int> coordinate;
struct customCRD {
std::vector<coordinate> Corners;
crdType type;
struct havingCorner {
coordinate _a;
havingCorner(coordinate a) : _a(a) {}
bool operator()(customCRD const& cc) const { return cc.Corners.end()!=std::find(cc.Corners.begin(), cc.Corners.end(), _a); }
};
};
int main() {
std::vector<customCRD> const v {
customCRD { { {1, 2}, {3, 4}, {5, 6} }, CARTESIAN },
customCRD { { {7, 8}, {9, 10}, {11, 12} }, SPHERICAL },
customCRD { { {13, 14}, {15, 16}, {17, 18} }, CUSTOM2 },
};
std::cout << "{9,10} found: " << std::boolalpha << !boost::empty(v | filtered(customCRD::havingCorner(coordinate(9,10)))) << "\n";
std::cout << "{3,5} found: " << std::boolalpha << !boost::empty(v | filtered(customCRD::havingCorner(coordinate(3, 5)))) << "\n";
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.