Поиск вектора станд. C++ структур для структуры с соответствующей строкой

Я уверен, что делаю это тяжелее, чем это должно быть.

У меня есть вектор...

vector mJointsVector;

... состоявший из структур, сделанных по образцу следующего:

struct Joints
{
    string name;

    float origUpperLimit;
    float origLowerLimit;   
};

Я пытаюсь искать mJointsVector со "станд.:: найдите" для определения местоположения отдельного соединения его именем строки - никакая удача до сих пор, но примеры от следующего не помогла по крайней мере концептуально:

Векторы, структуры и станд.:: найти

Кто-либо может указать на меня далее в правильном направлении?

7
задан Community 23 May 2017 в 12:18
поделиться

6 ответов

Прямой подход:

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 , чтобы уменьшить объем кода.

16
ответ дан 6 December 2019 в 07:50
поделиться

Вы должны иметь возможность добавить оператор равенства в свою структуру

struct Joints
{
    std::string name;

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

Затем вы можете искать, используя find.

1
ответ дан 6 December 2019 в 07:50
поделиться
bool
operator == (const Joints& joints, const std::string& name) {
    return joints.name == name;
}

std::find(mJointsVector.begin(), mJointsVector.end(), std::string("foo"));
0
ответ дан 6 December 2019 в 07:50
поделиться

как насчет:

std::string name = "xxx";

std::find_if(mJointsVector.begin(), 
             mJointsVector.end(), 
             [&s = name](const Joints& j) -> bool { return s == j.name; }); 
5
ответ дан 6 December 2019 в 07:50
поделиться
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")) ;
0
ответ дан 6 December 2019 в 07:50
поделиться
#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);
1
ответ дан 6 December 2019 в 07:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: