Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.c++ > #7221

Re: STL set Problem

From Kai-Uwe Bux <jkherciueh@gmx.net>
Newsgroups comp.lang.c++
Subject Re: STL set Problem
Followup-To comp.lang.c++
Date 2011-06-29 01:00 +0200
Organization University of Bielefeld
Message-ID <iudmdk$aek$1@hoshi.visyn.net> (permalink)
References <MPG.287405c21e5896de9896bc@news.eternal-september.org>

Followups directed to: comp.lang.c++

Show all headers | View raw


Mike Copeland wrote:

>    I have the following application stub that compiles and works.  Now I
> wish to add "find" functionality (based on matching the "baseBib"
> element), and I can't see from the documentation or examples I've found
> hoe to do so.  The STL set "find" seems meant only for scalar objects
> (but the optional insert parameter supports field-based ordering...).
>    What am I missing in this?

I don't understand the bit about scalar objects.


> #pragma warning (disable:4786)
> #include <set>
> #include <iostream>
> #include <string>
> using namespace std;
> 
> class Entrant
> {
> public:
> int  baseBib;
> char baseEvent;
> };
> class LoToHigh
> {
> public:
> bool operator()(Entrant s1, Entrant s2)
> {
> if(s1.baseBib < s2.baseBib) return true;
> else                        return false;
> }
> };

The function std::set<>::find() uses the notion of equivalence. Two entries 
a and b are equivalent when neither a<b nor b<a. In your case, that should 
amount to the baseBib fields being equal. Thus, if you are given an int 
value bib, you can search for that, by doing:

  find( Entrant( bib, 0 ) )

I.e., you turn this into a meaningless Entrant object with correct baseBib 
value and search for that. The invented value for baseEvent will be ignored 
within the comparison predicate.


> int main(int argc, char* argv[])
> {
> set <Entrant, LoToHigh> myEntrant;
> set <Entrant, LoToHigh>::iterator it;
> Entrant a1, a2, a3;
> 
> a1.baseBib = 2077, a1.baseEvent = 'a';
> a2.baseBib = 2066, a2.baseEvent = 'b';
> a3.baseBib = 2055, a3.baseEvent = 'a';
> myEntrant.insert(a1), myEntrant.insert(a2);
> myEntrant.insert(a1), myEntrant.insert(a3);
> cout << "The # of Entrants is " << myEntrant.size() << endl;
> for(it = myEntrant.begin(); it != myEntrant.end(); it++)
> {
> cout << it->baseBib << "\t" << it->baseEvent << endl;
> }
> return 0;
> }

Things to ponder:

a) Would std::map<> be better for this.
b) Are baseBib values guaranteed to be unique? std::set<> will purge 
previous entries when equivalent entries arive.


Best,

Kai-Uwe Bux

Back to comp.lang.c++ | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

STL set Problem mrc2323@cox.net (Mike Copeland) - 2011-06-28 15:38 -0700
  Re: STL set Problem Ian Collins <ian-news@hotmail.com> - 2011-06-29 10:57 +1200
    Re: STL set Problem mrc2323@cox.net (Mike Copeland) - 2011-06-28 16:04 -0700
  Re: STL set Problem Kai-Uwe Bux <jkherciueh@gmx.net> - 2011-06-29 01:00 +0200
    Re: STL set Problem mrc2323@cox.net (Mike Copeland) - 2011-06-28 16:07 -0700
    Re: STL set Problem mrc2323@cox.net (Mike Copeland) - 2011-06-28 21:10 -0700
  Re: STL set Problem Werner Erasmus <werasm@gmail.com> - 2011-07-06 21:29 +0200

csiph-web