简体   繁体   English

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM