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);
}
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
}
4条答案
按热度按时间ddhy6vgd1#
您可以将
std::find_if
与合适的函子一起使用。在本示例中,使用了C++11 lambda:字符串
如果你没有C++11 lambda支持,一个仿函数可以工作:
型
在这里,
MatchString
是一个类型,它的示例可以用一个Type
对象调用,并返回一个布尔值。例如,型
然后你可以把一个示例传递给
std::find
型
3qpi33ja2#
除了Lambda和juancho使用的手写体函子之外,你还可以使用
boost::bind
(C03)或std::bind
(C11)和一个简单的函数:字符串
或者,如果
Type
有一个方法isName
:型
这只是为了完整起见。在C11中我更喜欢Lambdas,在C03中我只在比较函数本身已经存在的情况下使用bind。如果不存在,我更喜欢functor。
**PS:**由于C11没有多态/模板化的参数类型,bind在C11中仍然有它的位置,例如,如果参数类型未知,难以拼写,或者不容易推断。
8wtpewkr3#
一个简单的迭代器可能会有所帮助。
字符串
vsdwdz234#
在C++20中,使用
std::ranges::find
和投影变得更加容易:字符串
See it online的