在结构向量的向量成员内部搜索

searching inside vector member of struct vector

我有一个这样的结构:

enum crdType { CARTESIAN =0, SPHERICAL, CUSTOM1, CUSTOM2, .......};

struct customCRD {
   std::vector<coordinate> Corners;
   crdType type;
};

然后我定义了一个vector,姑且称之为vec_customCRD。

我想检查我的坐标是否在这个矢量内。 我可以检查特定类型是否可用:

vector < customCRD >::iterator iter = std::find_if(vec_customCRD.begin(), vec_customCRD.end(), boost::bind(&customCRD::type, _1) == CUSTOM1);

它是一种搜索坐标,在这里,在向量的向量中。

有什么聪明的方法吗?

编辑 我忘了说我不能使用 C++11。并且提升版本高于 1.56

我想执行以下代码:

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;
  }
}  

如果你想使用 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";
};

谓词定义为:

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); }
    };
};

看到它Live On Coliru(c++11有数据)

看到了Live On 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";
}