Я уверен, что делаю это тяжелее, чем это должно быть.
У меня есть вектор...
vector mJointsVector;
... состоявший из структур, сделанных по образцу следующего:
struct Joints
{
string name;
float origUpperLimit;
float origLowerLimit;
};
Я пытаюсь искать mJointsVector со "станд.:: найдите" для определения местоположения отдельного соединения его именем строки - никакая удача до сих пор, но примеры от следующего не помогла по крайней мере концептуально:
Векторы, структуры и станд.:: найти
Кто-либо может указать на меня далее в правильном направлении?
Прямой подход:
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 , чтобы уменьшить объем кода.
Вы должны иметь возможность добавить оператор равенства в свою структуру
struct Joints
{
std::string name;
bool operator==(const std::string & str) { return name == str; }
};
Затем вы можете искать, используя find.
bool
operator == (const Joints& joints, const std::string& name) {
return joints.name == name;
}
std::find(mJointsVector.begin(), mJointsVector.end(), std::string("foo"));
как насчет:
std::string name = "xxx";
std::find_if(mJointsVector.begin(),
mJointsVector.end(),
[&s = name](const Joints& j) -> bool { return s == j.name; });
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")) ;
#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);