Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > using find to find a member of a struct in vector

Reply
Thread Tools

using find to find a member of a struct in vector

 
 
tehn.yit.chin@gmail.com
Guest
Posts: n/a
 
      03-27-2006
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.

 
Reply With Quote
 
 
 
 
Sunil Varma
Guest
Posts: n/a
 
      03-27-2006

http://www.velocityreviews.com/forums/(E-Mail Removed) wrote:
> 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.

 
Reply With Quote
 
 
 
 
Gernot Frisch
Guest
Posts: n/a
 
      03-27-2006

> 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?


 
Reply With Quote
 
Sumit Rajan
Guest
Posts: n/a
 
      03-27-2006

(E-Mail Removed) wrote:
> 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.

 
Reply With Quote
 
Daniel T.
Guest
Posts: n/a
 
      03-27-2006
In article <(E-Mail Removed) .com>,
(E-Mail Removed) wrote:

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



--
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.
 
Reply With Quote
 
tehn.yit.chin@gmail.com
Guest
Posts: n/a
 
      03-27-2006
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>
>]':

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

 
Reply With Quote
 
tehn.yit.chin@gmail.com
Guest
Posts: n/a
 
      03-27-2006
Thanks guys for your respones. This has cleared this up enormously.

cheers,
tyc

 
Reply With Quote
 
Gernot Frisch
Guest
Posts: n/a
 
      03-29-2006

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

provide this one.


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Free memory allocate by a STL vector, vector of vector, map of vector Allerdyce.John@gmail.com C++ 8 02-18-2006 12:48 AM
Using an instance of a struct as a member of that struct dutchgoldtony C Programming 15 11-16-2005 11:24 PM
struct my_struct *p = (struct my_struct *)malloc(sizeof(struct my_struct)); Chris Fogelklou C Programming 36 04-20-2004 08:27 AM
How would I use qsort to sort a struct with a char* member and a long member - I want to sort in order of the long member Angus Comber C Programming 7 02-05-2004 06:41 PM
how do I access a member of vector when this vector is a member of a class ding feng C++ 8 07-02-2003 08:06 AM



Advertisments