Connecting Tech Pros Worldwide Forums | Help | Site Map

using find to find a member of a struct in vector

tehn.yit.chin@gmail.com
Guest
 
Posts: n/a
#1: Mar 27 '06
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.


Sunil Varma
Guest
 
Posts: n/a
#2: Mar 27 '06

re: using find to find a member of a struct in vector



tehn.yit.chin@gmail.com wrote:[color=blue]
> 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.[/color]

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.

Gernot Frisch
Guest
 
Posts: n/a
#3: Mar 27 '06

re: using find to find a member of a struct in vector


[color=blue]
> 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.[/color]

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


Sumit Rajan
Guest
 
Posts: n/a
#4: Mar 27 '06

re: using find to find a member of a struct in vector



tehn.yit.chin@gmail.com wrote:[color=blue]
> 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;
> };
>[/color]

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
}


[color=blue]
> 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);[/color]

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

Regards,
Sumit.

Daniel T.
Guest
 
Posts: n/a
#5: Mar 27 '06

re: using find to find a member of a struct in vector


In article <1143441709.867871.228430@i40g2000cwc.googlegroups .com>,
tehn.yit.chin@gmail.com wrote:
[color=blue]
> 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.[/color]

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" ) );



--
Magic depends on tradition and belief. It does not welcome observation,
nor does it profit by experiment. On the other hand, science is based
on experience; it is open to correction by observation and experiment.
tehn.yit.chin@gmail.com
Guest
 
Posts: n/a
#6: Mar 27 '06

re: using find to find a member of a struct in vector


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*,
std::vector<abc_struct, std::allocator<abc_struct> > >, _Tp =
std::basic_string<char, std::char_traits<char>, std::allocator<char>[color=blue]
>]':[/color]
/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>::operator* [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>::operator* [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>::operator* [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>::operator* [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>::operator* [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>::operator* [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>::operator* [with _Iterator = abc_struct*, _Container =
std::vector<abc_struct, std::allocator<abc_struct> >]() == __val'
[tehn-yit.chin@riesling Promotion_Manager]$

tehn.yit.chin@gmail.com
Guest
 
Posts: n/a
#7: Mar 27 '06

re: using find to find a member of a struct in vector


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

cheers,
tyc

Gernot Frisch
Guest
 
Posts: n/a
#8: Mar 29 '06

re: using find to find a member of a struct in vector



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

provide this one.


Closed Thread