7


1

一致する文字列を持つ構造体の構造体のC ++ stdベクトルの検索

私はこれを必要以上に難しくしていると確信しています。

ベクターがあります…​

vector mJointsVector;

…​comprised of structs patterned after the following:

struct Joints
{
    string name;

    float origUpperLimit;
    float origLowerLimit;
};
私は「std

find」でmJointsVectorを検索して、文字列名で個々のジョイントを見つけようとしています-これまでのところ運はありませんが、少なくとも概念的には次の例が役立ちました:

https://stackoverflow.com/questions/589985/vectors-structs-and-stdfind[Vectors、structs and std

find]

誰かが私をさらに正しい方向に向けることができますか?

6 Answer


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::iterator it = std::find_if(m_jointsVector.begin(),
                                                m_jointsVector.end(),
                                                FindByName("foo"));

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

または、http://www.boost.org/doc/libs/1_41_0/libs/bind/bind.html [Boost.Bind]のようなものを調べて、コードの量を減らすこともできます。


5


どうですか?

std::string name = "xxx";

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


1


等しい演算子を追加して構造体を作成できるはずです

struct Joints
{
    std::string name;

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

その後、findを使用して検索できます。


1


#include

std::vector::iterator it;

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


0


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

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


0


struct Compare: public unary_function
{
     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")) ;