using find to find a member of a struct in vector

T

tehn.yit.chin

I am trying to experiment <algorithm>'s find to search for an item in a
vector of struct. My bit of test code is shown below.

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

struct abc_struct
{
std::string student;
std::string school;
};

int main()
{

std::vector<abc_struct> abc;

abc_struct temp_abc;

temp_abc.student = "John Snoden";
temp_abc.school = "Melbourne high school";
abc.push_back(temp_abc);

temp_abc.student = "Jane Doe";
temp_abc.school = "Lareto College";
abc.push_back(temp_abc);

std::vector<abc_struct>::iterator result;
temp_abc.student = "John Snoden";

result = find( abc.begin(), abc.end(), temp_abc.student);

if (result == abc.end())
{
std::cout << "NOT found\n";
}
else
{
std::cout << "found\n";
}
}


When I try to build it, the compiler complains for "no match for for
operation ==' in std_algo.h. I don't fully understand what the error
message is trying to say. Am I suppose to provide a camparison function
for the abc_struct? If I am, is it suppose to be a member function of
the abc_struct class?

many thanks for your assistance.
 
S

Sunil Varma

I am trying to experiment <algorithm>'s find to search for an item in a
vector of struct. My bit of test code is shown below.

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

struct abc_struct
{
std::string student;
std::string school;
};

int main()
{

std::vector<abc_struct> abc;

abc_struct temp_abc;

temp_abc.student = "John Snoden";
temp_abc.school = "Melbourne high school";
abc.push_back(temp_abc);

temp_abc.student = "Jane Doe";
temp_abc.school = "Lareto College";
abc.push_back(temp_abc);

std::vector<abc_struct>::iterator result;
temp_abc.student = "John Snoden";

result = find( abc.begin(), abc.end(), temp_abc.student);

if (result == abc.end())
{
std::cout << "NOT found\n";
}
else
{
std::cout << "found\n";
}
}


When I try to build it, the compiler complains for "no match for for
operation ==' in std_algo.h. I don't fully understand what the error
message is trying to say. Am I suppose to provide a camparison function
for the abc_struct? If I am, is it suppose to be a member function of
the abc_struct class?

many thanks for your assistance.

find() function assumes you to provide an operator==() overloaded
function, in case the search key not a basic type.
You are supposed to provide a member function in abc_struct structure
overloading == operator.
And also you are trying to compare just string to abc_struct structure
in the find() call.
 
G

Gernot Frisch

When I try to build it, the compiler complains for "no match for for
operation ==' in std_algo.h. I don't fully understand what the error
message is trying to say.

So, why don't you post the compiler error?
 
S

Sumit Rajan

I am trying to experiment <algorithm>'s find to search for an item in a
vector of struct. My bit of test code is shown below.

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

struct abc_struct
{
std::string student;
std::string school;
};

You could add:
bool operator ==(const abc_struct& lhs, const abc_struct& rhs)
{
return (lhs.student == rhs.student); //i'm assuming you do not want
to compare schools here
}


int main()
{

std::vector<abc_struct> abc;

abc_struct temp_abc;

temp_abc.student = "John Snoden";
temp_abc.school = "Melbourne high school";
abc.push_back(temp_abc);

temp_abc.student = "Jane Doe";
temp_abc.school = "Lareto College";
abc.push_back(temp_abc);

std::vector<abc_struct>::iterator result;
temp_abc.student = "John Snoden";

result = find( abc.begin(), abc.end(), temp_abc.student);

result = find( abc.begin(), abc.end(), temp_abc);
if (result == abc.end())
{
std::cout << "NOT found\n";
}
else
{
std::cout << "found\n";
}
}

Regards,
Sumit.
 
D

Daniel T.

I am trying to experiment <algorithm>'s find to search for an item in a
vector of struct. My bit of test code is shown below.

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

struct abc_struct
{
std::string student;
std::string school;
};

int main()
{

std::vector<abc_struct> abc;

abc_struct temp_abc;

temp_abc.student = "John Snoden";
temp_abc.school = "Melbourne high school";
abc.push_back(temp_abc);

temp_abc.student = "Jane Doe";
temp_abc.school = "Lareto College";
abc.push_back(temp_abc);

std::vector<abc_struct>::iterator result;
temp_abc.student = "John Snoden";

result = find( abc.begin(), abc.end(), temp_abc.student);

if (result == abc.end())
{
std::cout << "NOT found\n";
}
else
{
std::cout << "found\n";
}
}


When I try to build it, the compiler complains for "no match for for
operation ==' in std_algo.h. I don't fully understand what the error
message is trying to say. Am I suppose to provide a camparison function
for the abc_struct? If I am, is it suppose to be a member function of
the abc_struct class?

many thanks for your assistance.

The obvious patch is to simply add an op== that compares an abc_struct
to a string:

bool operator==( const abc_struct& abc, const string& str ) {
return abc.student == str;
}

But, what if you later want to look for abc_structs that have a
particular value for 'school'? In that case, your best bet would be to
provide a function that gets the student or school out of abc_struct and
use the op== provided for the string class. For this though, you can't
use 'find' you must use 'find_if' instead...

struct comp_student : std::binary_function<abc_struct, std::string, bool>
{
bool operator()( const abc_struct& abc, const std::string& name )
const {
return abc.student == name;
}
};

result = find_if( abc.begin(), abc.end(),
std::bind2nd( comp_student(), "John Snoden" ) );

However, since you have to create a structure anyway...

struct has_name
{
std::string name_sought;
has_name( std::string n ): name_sought( n ) { }
bool operator()( const abc_struct& abc ) const {
return abc.student == name_sought;
}
};


result = find_if( abc.begin(), abc.end(), has_name( "John Snoden" ) );
 
T

tehn.yit.chin

A copy of the compiler output is ....

[tehn-yit.chin@riesling Promotion_Manager]$ g++ -o abc test.cpp
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/bits/stl_algo.h:
In function `_RandomAccessIterator std::find(_RandomAccessIterator,
_RandomAccessIterator, const _Tp&, std::random_access_iterator_tag)
[with _RandomAccessIterator = __gnu_cxx::__normal_iterator<abc_struct*,
_Tp = said:
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/bits/stl_algo.h:314:
instantiated from `_InputIterator std::find(_InputIterator,
_InputIterator, const _Tp&) [with _InputIterator =
__gnu_cxx::__normal_iterator<abc_struct*, std::vector<abc_struct,
std::allocator<abc_struct> > >, _Tp = std::string]'
test.cpp:31: instantiated from here
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/bits/stl_algo.h:207:
error: no match for 'operator==' in
'(&__first)->__gnu_cxx::__normal_iterator<_Iterator,
_Container>::eek:perator* [with _Iterator = abc_struct*, _Container =
std::vector<abc_struct, std::allocator<abc_struct> >]() == __val'
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/bits/stl_algo.h:314:
instantiated from `_InputIterator std::find(_InputIterator,
_InputIterator, const _Tp&) [with _InputIterator =
__gnu_cxx::__normal_iterator<abc_struct*, std::vector<abc_struct,
std::allocator<abc_struct> > >, _Tp = std::string]'
test.cpp:31: instantiated from here
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/bits/stl_algo.h:211:
error: no match for 'operator==' in
'(&__first)->__gnu_cxx::__normal_iterator<_Iterator,
_Container>::eek:perator* [with _Iterator = abc_struct*, _Container =
std::vector<abc_struct, std::allocator<abc_struct> >]() == __val'
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/bits/stl_algo.h:314:
instantiated from `_InputIterator std::find(_InputIterator,
_InputIterator, const _Tp&) [with _InputIterator =
__gnu_cxx::__normal_iterator<abc_struct*, std::vector<abc_struct,
std::allocator<abc_struct> > >, _Tp = std::string]'
test.cpp:31: instantiated from here
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/bits/stl_algo.h:215:
error: no match for 'operator==' in
'(&__first)->__gnu_cxx::__normal_iterator<_Iterator,
_Container>::eek:perator* [with _Iterator = abc_struct*, _Container =
std::vector<abc_struct, std::allocator<abc_struct> >]() == __val'
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/bits/stl_algo.h:314:
instantiated from `_InputIterator std::find(_InputIterator,
_InputIterator, const _Tp&) [with _InputIterator =
__gnu_cxx::__normal_iterator<abc_struct*, std::vector<abc_struct,
std::allocator<abc_struct> > >, _Tp = std::string]'
test.cpp:31: instantiated from here
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/bits/stl_algo.h:219:
error: no match for 'operator==' in
'(&__first)->__gnu_cxx::__normal_iterator<_Iterator,
_Container>::eek:perator* [with _Iterator = abc_struct*, _Container =
std::vector<abc_struct, std::allocator<abc_struct> >]() == __val'
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/bits/stl_algo.h:314:
instantiated from `_InputIterator std::find(_InputIterator,
_InputIterator, const _Tp&) [with _InputIterator =
__gnu_cxx::__normal_iterator<abc_struct*, std::vector<abc_struct,
std::allocator<abc_struct> > >, _Tp = std::string]'
test.cpp:31: instantiated from here
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/bits/stl_algo.h:227:
error: no match for 'operator==' in
'(&__first)->__gnu_cxx::__normal_iterator<_Iterator,
_Container>::eek:perator* [with _Iterator = abc_struct*, _Container =
std::vector<abc_struct, std::allocator<abc_struct> >]() == __val'
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/bits/stl_algo.h:314:
instantiated from `_InputIterator std::find(_InputIterator,
_InputIterator, const _Tp&) [with _InputIterator =
__gnu_cxx::__normal_iterator<abc_struct*, std::vector<abc_struct,
std::allocator<abc_struct> > >, _Tp = std::string]'
test.cpp:31: instantiated from here
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/bits/stl_algo.h:231:
error: no match for 'operator==' in
'(&__first)->__gnu_cxx::__normal_iterator<_Iterator,
_Container>::eek:perator* [with _Iterator = abc_struct*, _Container =
std::vector<abc_struct, std::allocator<abc_struct> >]() == __val'
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/bits/stl_algo.h:314:
instantiated from `_InputIterator std::find(_InputIterator,
_InputIterator, const _Tp&) [with _InputIterator =
__gnu_cxx::__normal_iterator<abc_struct*, std::vector<abc_struct,
std::allocator<abc_struct> > >, _Tp = std::string]'
test.cpp:31: instantiated from here
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/bits/stl_algo.h:235:
error: no match for 'operator==' in
'(&__first)->__gnu_cxx::__normal_iterator<_Iterator,
_Container>::eek:perator* [with _Iterator = abc_struct*, _Container =
std::vector<abc_struct, std::allocator<abc_struct> >]() == __val'
[tehn-yit.chin@riesling Promotion_Manager]$
 
T

tehn.yit.chin

Thanks guys for your respones. This has cleared this up enormously.

cheers,
tyc
 
G

Gernot Frisch

error: no match for 'operator==' in
[with _Iterator = abc_struct*, _Container =
std::vector<abc_struct, std::allocator<abc_struct> ]

provide this one.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,767
Messages
2,569,570
Members
45,045
Latest member
DRCM

Latest Threads

Top