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

Mon*_*urd 7 c++ vector std find data-structures

我敢肯定,我正在努力实现这一目标.

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

vector<Joints> mJointsVector;
Run Code Online (Sandbox Code Playgroud)

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

struct Joints
{
    string name;

    float origUpperLimit;
    float origLowerLimit;   
};
Run Code Online (Sandbox Code Playgroud)

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

向量,结构和std :: find

任何人都能指出我在正确的方向吗?

Geo*_*che 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()) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

  • 虽然这有效,但我认为函数对象的operator()应该始终是const,只是为了灵活性.如果有一天你有一系列的const关节,那么函数对象仍然有效. (2认同)

小智 5

怎么样:

std::string name = "xxx";

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

  • 它没有错,它是正确的,并且在几年的时间内,与其他答案相比,这个答案将被视为"更"正确. (7认同)
  • @dribeas:(1)类型是关节不联合(2)比较是正确的 - 请阅读代码(3)一般来说这是C++的发展方向,人们应该开始使用这些功能而不是用vc6,vc8 ,vc9 gen编译器. (3认同)
  • @GMan:jeeez你对我来说太快了,我希望通过这个编辑深入了解:> (2认同)