gcc 通过对象属性搜索对象的向量

wnvonmuf  于 6个月前  发布在  其他
关注(0)|答案(4)|浏览(73)

我试图找出一个很好的方法来找到向量中某个对象的索引-通过将字符串与对象中的成员字段进行比较。
就像这样:

find(vector.begin(), vector.end(), [object where obj.getName() == myString])

字符串
我已经搜索没有成功-也许我不完全明白要找什么。

ddhy6vgd

ddhy6vgd1#

您可以将std::find_if与合适的函子一起使用。在本示例中,使用了C++11 lambda:

std::vector<Type> v = ....;
std::string myString = ....;
auto it = find_if(v.begin(), v.end(), [&myString](const Type& obj) {return obj.getName() == myString;})

if (it != v.end())
{
  // found element. it is an iterator to the first matching element.
  // if you really need the index, you can also get it:
  auto index = std::distance(v.begin(), it);
}

字符串
如果你没有C++11 lambda支持,一个仿函数可以工作:

struct MatchString
{
 MatchString(const std::string& s) : s_(s) {}
 bool operator()(const Type& obj) const
 {
   return obj.getName() == s_;
 }
 private:
   const std::string& s_;
};


在这里,MatchString是一个类型,它的示例可以用一个Type对象调用,并返回一个布尔值。例如,

Type t("Foo"); // assume this means t.getName() is "Foo"
MatchString m("Foo");
bool b = m(t); // b is true


然后你可以把一个示例传递给std::find

std::vector<Type>::iterator it = find_if(v.begin(), v.end(), MatchString(myString));

3qpi33ja

3qpi33ja2#

除了Lambda和juancho使用的手写体函子之外,你还可以使用boost::bind(C03)或std::bind(C11)和一个简单的函数:

bool isNameOfObj(const std::string& s, const Type& obj)
{ return obj.getName() == s; }

//...
std::vector<Type>::iterator it = find_if(v.begin(), v.end(), 
  boost::bind(&isNameOfObj, myString, boost::placeholders::_1));

字符串
或者,如果Type有一个方法isName

std::vector<Type>::iterator it = find_if(v.begin(), v.end(), 
  boost::bind(&Type::isName, boost::placeholders::_1, myString));


这只是为了完整起见。在C11中我更喜欢Lambdas,在C03中我只在比较函数本身已经存在的情况下使用bind。如果不存在,我更喜欢functor。

**PS:**由于C11没有多态/模板化的参数类型,bind在C11中仍然有它的位置,例如,如果参数类型未知,难以拼写,或者不容易推断。

8wtpewkr

8wtpewkr3#

一个简单的迭代器可能会有所帮助。

typedef std::vector<MyDataType> MyDataTypeList;
// MyDataType findIt should have been defined and assigned 
MyDataTypeList m_MyObjects;
//By this time, the push_back() calls should have happened
MyDataTypeList::iterator itr = m_MyObjects.begin();
while (itr != m_MyObjects.end())
{
  if(m_MyObjects[*itr] == findIt) // any other comparator you may want to use
    // do what ever you like
}

字符串

vsdwdz23

vsdwdz234#

在C++20中,使用std::ranges::find和投影变得更加容易:

struct MyStruct {
    std::string x;
    std::string y;
};

std::vector<MyStruct> v = {{"Hello", "World"}, {"asdf", "zxcv"}};
auto iter = std::ranges::find(v, "Hello", &MyStruct::x);

字符串
See it online

相关问题