使用匹配的字符串搜索结构的c ++ std向量

时间:2010-01-08 06:42:15

标签: c++ data-structures find vector std

我确信我正在努力实现这一目标。

我有一个矢量......

vector<Joints> mJointsVector;

...由以下图案构成的结构组成:

struct Joints
{
    string name;

    float origUpperLimit;
    float origLowerLimit;   
};

我正在尝试使用“std :: find”搜索mJointsVector,以通过其字符串名称找到一个单独的关节 - 到目前为止没有运气,但以下示例至少在概念上有所帮助:

Vectors, structs and std::find

有人能指出我正确的方向吗?

6 个答案:

答案 0 :(得分:16)

直接的方法:

struct FindByName {
    const std::string name;
    FindByName(const std::string& name) : name(name) {}
    bool operator()(const Joints& j) const { 
        return j.name == name; 
    }
};

std::vector<Joints>::iterator it = std::find_if(m_jointsVector.begin(),
                                                m_jointsVector.end(),
                                                FindByName("foo"));

if(it != m_jointsVector.end()) {
    // ...
}

或者,您可能希望查看Boost.Bind之类的内容以减少代码量。

答案 1 :(得分:5)

怎么样:

std::string name = "xxx";

std::find_if(mJointsVector.begin(), 
             mJointsVector.end(), 
             [&s = name](const Joints& j) -> bool { return s == j.name; }); 

答案 2 :(得分:1)

你应该能够添加一个等于运算符的结构

struct Joints
{
    std::string name;

    bool operator==(const std::string & str) { return name == str; }
};

然后您可以使用find进行搜索。

答案 3 :(得分:1)

#include <boost/bind.hpp>

std::vector<Joints>::iterator it;

it = std::find_if(mJointsVector.begin(),
                  mJointsVector.end(),
                  boost::bind(&Joints::name, _1) == name_to_find);

答案 4 :(得分:0)

bool
operator == (const Joints& joints, const std::string& name) {
    return joints.name == name;
}

std::find(mJointsVector.begin(), mJointsVector.end(), std::string("foo"));

答案 5 :(得分:0)

struct Compare: public unary_function <const string&>
{
     public:
            Compare(string _findString):mfindString(_findString){}
            bool operator () (string _currString)
            {
                return _currString == mfindString ;
            }
     private:
            string mfindString ;
}

std::find_if(mJointsVector.begin(), mJointsVector.end(), Compare("urstring")) ;