472,353 Members | 2,062 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 472,353 software developers and data experts.

std::pair<,>


Hello,

I would like to ask how come the design of C++ includes
std::pair. First of all I don't think many programmers
would use it. For starters, what the first and second
members are depends on what you are using the pair
for. For instance if I am using coordinates in two
dimensional space then I like to use x and y. So
I might as well define my own struct with x and
y members in it and create a constructor so
that I can easily instantiate pairs.

I wonder if there is a way to create a pair class
using std::pair but typedef its first and second
to x and y using C++. The only way I can think
of is to subclass std::pair<,>.

Suggestions and reccomendation on the best
practices and conventions for using std::pair<,>
are most welcome.

Thanks,

Neil

Jul 19 '05 #1
14 45647

Here is my way of making use of std::pair<class T1, class T2>:

#include <iostream>
#include <utility>

template<class T1, class T2>
class Coordinate: public std::pair<T1, T2> {
public:
Coordinate(T1 x, T2 y): std::pair<T1, T2>(x, y), x(first), y(second) { }
T1 &x;
T2 &y;
};

int main() {
Coordinate<int, int> foo(1, 2);
std::cout << "x = " << foo.x << "\ny = " << foo.y << std::endl;
}
Suggestions and reccomendation on the best
practices and conventions for using std::pair<,>
are most welcome.

Thanks,

Neil


Jul 19 '05 #2
> I would like to ask how come the design of C++ includes
std::pair.
I think primarly for std::map and the map-like containers.
First of all I don't think many programmers
would use it.
Depends on the programmer, I think. I use it quite
often.
For starters, what the first and second
members are depends on what you are using the pair
for. For instance if I am using coordinates in two
dimensional space then I like to use x and y. So
I might as well define my own struct with x and
y members in it and create a constructor so
that I can easily instantiate pairs.
Yes. std::pair<> was not created specifically to replace
every ud structs representing two entities.
I wonder if there is a way to create a pair class
using std::pair but typedef its first and second
to x and y using C++. The only way I can think
of is to subclass std::pair<,>.
That would be one way if you want your struct to be
compatible with std::pair<>. If not, make it
a private member or, as you said, create a new
struct.
Suggestions and reccomendation on the best
practices and conventions for using std::pair<,>
are most welcome.


There are none, imho.
Jonathan
Jul 19 '05 #3
Neil Zanella wrote:

Hello,

I would like to ask how come the design of C++ includes
std::pair. First of all I don't think many programmers
would use it.

I generally use std::make_pair().


Brian Rodenborn
Jul 19 '05 #4
Neil Zanella wrote:

Hello,

I would like to ask how come the design of C++ includes
std::pair. First of all I don't think many programmers
would use it. For starters, what the first and second
members are depends on what you are using the pair
for. For instance if I am using coordinates in two
dimensional space then I like to use x and y. So
I might as well define my own struct with x and
y members in it and create a constructor so
that I can easily instantiate pairs.

I wonder if there is a way to create a pair class
using std::pair but typedef its first and second
to x and y using C++. The only way I can think
of is to subclass std::pair<,>.

Suggestions and reccomendation on the best
practices and conventions for using std::pair<,>
are most welcome.


I think you can start by doing something like

template <typename T>
class Point : public std::pair<T,T>
{
public:
T& x,y;
Point(const T& a, const T& b) : std::pair<T,T>(a,b), x(first),
y(second) {}
/* ... */
};

This gives you more of a pointy interface while also modeling a
container.

/david

--
Andre, a simple peasant, had only one thing on his mind as he crept
along the East wall: 'Andre, creep... Andre, creep... Andre, creep.'
-- unknown
Jul 19 '05 #5
WW
Neil Zanella wrote:
Here is my way of making use of std::pair<class T1, class T2>:

#include <iostream>
#include <utility>

template<class T1, class T2>
class Coordinate: public std::pair<T1, T2> {
public:
Coordinate(T1 x, T2 y): std::pair<T1, T2>(x, y), x(first),
y(second) { } T1 &x;
T2 &y;
};


The above class cannot be assigned, or copy constructed. Plus: do not use
inheritance when composition suffices:

template<class T1, class T2>
struct Coordinate {
Coordinate():
store(T1(),T2()), x(store.first), y(store.second) { }
Coordinate(T1 px, T2 py):
store(px,py), x(store.first), y(store.second) { }
Coordinate(Coordinate const &o):
store(o.store), x(store.first), y(store.second) { }
Coordinate operator=(Coordinate const &o)
{ store = o.store; }
T1 &x;
T2 &y;
private:
std::pair<T1, T2> store;
};

Also note that the above class will be bigger than the pair. In case of
int, on a usual architecture it will be twice as big. So IMHO you are
better off having accessor functions - if you must access the elements from
the outside.

template<class T1, class T2>
struct Coordinate {
Coordinate(): store(T1(),T2()) { }
Coordinate(T1 px, T2 py): store(px,py) { }
Coordinate(Coordinate const &o): store(o.store) { }
Coordinate operator=(Coordinate const &o) { store = o.store; }
T1 &x() {return store.first; }
T2 &y() {return store.second; }
private:
std::pair<T1, T2> store;
};

But to be honest I would just leave std::pair out of this completely and
make a little template struct of my own, with the right names.

--
WW aka Attila
Jul 19 '05 #6
"Neil Zanella" <nz******@cs.mun.ca> wrote in message
news:Pi**************************************@garf ield.cs.mun.ca...

Hello,

I would like to ask how come the design of C++ includes
std::pair.
It's useful for some things. If you don't find it
useful, don't use it.

Also note that the standard container types 'std::map'
and 'std::multimap' use type 'std::pair' objects to represent
their elements. If you use a map or multimap, you're
(at least indirectly) using 'std::pair' objects.
Also e.g. one of the overloads of 'std::map::insert()'
returns a 'std::pair' object (not an element value,
but a pair of values, the first of which is an iterator
object pointing to the inserted element (if one was inserted),
and the other a type 'bool' indicating whether or not
the insertion occurred.)

'std::pair' can also be used as a 'general purpose'
set of two values.
First of all I don't think many programmers
would use it.
I do.
For starters, what the first and second
members are depends on what you are using the pair
for.
Well of course.
For instance if I am using coordinates in two
dimensional space then I like to use x and y.
But what are their types? Are the types the same?
The already existing template 'std::pair' will
handle them whatever they are.
So
I might as well define my own struct with x and
y members in it and create a constructor so
that I can easily instantiate pairs.
This can already be done with 'std::pair', which
has three constructors defined (one of them a
template). "Don't reinvent the wheel" and all that.

I wonder if there is a way to create a pair class
using std::pair but typedef its first and second
to x and y using C++.
Are 'x' and 'y' types or values? In either case,
std::pair can handle it.

The only way I can think
of is to subclass std::pair<,>.
IMO no reason to.

std::pair<T,T>(x,y);

Done. :-)

Also see 'std::make_pair()'


Suggestions and reccomendation on the best
practices and conventions for using std::pair<,>
are most welcome.


Use it if useful, don't use it if not.

-Mike
Jul 19 '05 #7
Mike Wahler wrote:
I wonder if there is a way to create a pair class
using std::pair but typedef its first and second
to x and y using C++. [snip]The only way I can think
of is to subclass std::pair<,>.


IMO no reason to.

std::pair<T,T>(x,y);


The question is, is a Point a pair? From the description of pair, it
seems like the answer is yes. So, if you want a Point with members x and
y, why not subclass?

/david

--
Andre, a simple peasant, had only one thing on his mind as he crept
along the East wall: 'Andre, creep... Andre, creep... Andre, creep.'
-- unknown
Jul 19 '05 #8
David Rubin wrote:

[snip]
This gives you more of a pointy interface while also modeling a
container.


Not true; std::pair does not model a Container.

/david

--
Andre, a simple peasant, had only one thing on his mind as he crept
along the East wall: 'Andre, creep... Andre, creep... Andre, creep.'
-- unknown
Jul 19 '05 #9

"David Rubin" <bo***********@nomail.com> wrote in message
news:3F***************@nomail.com...
Mike Wahler wrote:
I wonder if there is a way to create a pair class
using std::pair but typedef its first and second
to x and y using C++. [snip]The only way I can think
of is to subclass std::pair<,>.
IMO no reason to.

std::pair<T,T>(x,y);


The question is, is a Point a pair? From the description of pair, it
seems like the answer is yes.


Agreed.
So, if you want a Point with members x and
y, why not subclass?


Why not simply:

std::pair<int,int> coord(x,y);

or if you like:

typedef std::pair<int,int> Point;

Point coord(x,y);

??

-Mike
Jul 19 '05 #10
> > So, if you want a Point with members x and
y, why not subclass?


Why not simply:

std::pair<int,int> coord(x,y);

or if you like:

typedef std::pair<int,int> Point;

Point coord(x,y);


The thig is

coord.first = 2;

is not quite representative, as opposed to

coord.x = 2;
Jonathan
Jul 19 '05 #11
WW
David Rubin wrote:
std::pair<T,T>(x,y);


The question is, is a Point a pair? From the description of pair, it
seems like the answer is yes. So, if you want a Point with members x
and y, why not subclass?


A point is not a pair. A point can be in 1 or 2 dimensions. A pair is
always a pair. They do look similar, but that is all.

--
WW aka Attila
Jul 19 '05 #12

"Jonathan Mcdougall" <jo***************@DELyahoo.ca> wrote in message
news:mr********************@weber.videotron.net...
So, if you want a Point with members x and
y, why not subclass?


Why not simply:

std::pair<int,int> coord(x,y);

or if you like:

typedef std::pair<int,int> Point;

Point coord(x,y);


The thig is

coord.first = 2;

is not quite representative, as opposed to

coord.x = 2;


Ah, ok I misunderstood. He wants specific member
names.

"Ne-e-e-e-e-ver Mind!"
-Gilda Radner

-Mike
Jul 19 '05 #13
"Jonathan Mcdougall" <jo***************@DELyahoo.ca> wrote in message
The thing is

coord.first = 2;

is not quite representative, as opposed to

coord.x = 2;

Jonathan


That was exactly my point. As other posters have pointed out, there is a
function called std::make_pair(,) but that does not improve things much. Rather,
the main purpose of std::pair in the STL is so that in an associative container
such as an std::map or std::multimap you can use the .first notation to access
the key stored for a particular value (also accessed with .second). This is
quite handy since if you're iterating over a map you will need .first
to access the keys, and .second to access the values.

So, in conclusion, when dealing with points in two dimensional space (or other
dimensions for that matter) it's not very nice to use std::pair: that's not
what it was meant to. I don't think std::pair supports arithmetical operations
on points, and besides, using first and second instead of something like x and
y leads to poor naming. The names first and second are not suitable for all
applications from a semantical point of view: they make things harder to
interpret. The real use of std::pair is for providing first and second
to std::map and std::multimap.

Regards,

Neil
Jul 19 '05 #14
"WW" <wo***@freemail.hu> wrote in message
news:bl**********@phys-news1.kolumbus.fi...
Neil Zanella wrote:
Here is my way of making use of std::pair<class T1, class T2>:

#include <iostream>
#include <utility>

template<class T1, class T2>
class Coordinate: public std::pair<T1, T2> {
public:
Coordinate(T1 x, T2 y): std::pair<T1, T2>(x, y), x(first),
y(second) { } T1 &x;
T2 &y;
};
The above class cannot be assigned, or copy constructed. Plus: do not use
inheritance when composition suffices:

template<class T1, class T2>
struct Coordinate {
Coordinate():
store(T1(),T2()), x(store.first), y(store.second) { }
Coordinate(T1 px, T2 py):
store(px,py), x(store.first), y(store.second) { }
Coordinate(Coordinate const &o):
store(o.store), x(store.first), y(store.second) { }
Coordinate operator=(Coordinate const &o)
{ store = o.store; }
T1 &x;
T2 &y;
private:
std::pair<T1, T2> store;
};

Also note that the above class will be bigger than the pair. In case of
int, on a usual architecture it will be twice as big. So IMHO you are
better off having accessor functions - if you must access the elements

from the outside.

template<class T1, class T2>
struct Coordinate {
Coordinate(): store(T1(),T2()) { }
Coordinate(T1 px, T2 py): store(px,py) { }
Coordinate(Coordinate const &o): store(o.store) { }
Coordinate operator=(Coordinate const &o) { store = o.store; }
T1 &x() {return store.first; }
T2 &y() {return store.second; }
private:
std::pair<T1, T2> store;
};

But to be honest I would just leave std::pair out of this completely and
make a little template struct of my own, with the right names.

--
WW aka Attila


This thread is kind of an unintentional parody of going massively overboard
with reuse. Perhaps you should ask yourselves why the designers of the
standard library didn't derive std::complex from std::pair. The answer: they
weren't nuts. lol

If you want a class with an x and a y, just write one from scratch. It's
about 10 lines of code depending on how you format it. And anybody will be
able to understand it in a glance without wondering why you were standing on
your head to reuse std::pair.

--
Cy
http://home.rochester.rr.com/cyhome/
Jul 19 '05 #15

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

19
by: Erik Wikström | last post by:
First of all, forgive me if this is the wrong place to ask this question, if it's a stupid question (it's my second week with C++), or if this is...
6
by: pmatos | last post by:
Hi all, Is there a way of (after creating a pair) set its first and second element of not? (pair is definitely a read-only struct)? Cheers, ...
6
by: asdf | last post by:
It is best to show me some examples. Thanks a lot.
2
by: subramanian100in | last post by:
Consider the following piece of code: #include <iostream> #include <fstream> #include <vector> #include <string> #include <utility> #include...
18
by: subramanian100in | last post by:
Consider a class that has vector< pair<int, string>* c; as member data object. I need to use operator>to store values into this container...
9
by: shaun roe | last post by:
Question about pointer-to-data members I have a deeply nested loop, the innermost bit looks a little like this: for(it(vec.begin(),...
10
by: Alex Vinokur | last post by:
Hi, Is it possible to do C++-casting from const pair<const unsigned char*, size_t>* to const pair<unsigned char*, size_t>* ? Alex Vinokur
0
by: antdb | last post by:
Ⅰ. Advantage of AntDB: hyper-convergence + streaming processing engine In the overall architecture, a new "hyper-convergence" concept was...
0
by: Matthew3360 | last post by:
Hi there. I have been struggling to find out how to use a variable as my location in my header redirect function. Here is my code. ...
2
by: Matthew3360 | last post by:
Hi, I have a python app that i want to be able to get variables from a php page on my webserver. My python app is on my computer. How would I make it...
0
by: AndyPSV | last post by:
HOW CAN I CREATE AN AI with an .executable file that would suck all files in the folder and on my computerHOW CAN I CREATE AN AI with an .executable...
0
by: Arjunsri | last post by:
I have a Redshift database that I need to use as an import data source. I have configured the DSN connection using the server, port, database, and...
0
hi
by: WisdomUfot | last post by:
It's an interesting question you've got about how Gmail hides the HTTP referrer when a link in an email is clicked. While I don't have the specific...
0
by: Matthew3360 | last post by:
Hi, I have been trying to connect to a local host using php curl. But I am finding it hard to do this. I am doing the curl get request from my web...
0
BLUEPANDA
by: BLUEPANDA | last post by:
At BluePanda Dev, we're passionate about building high-quality software and sharing our knowledge with the community. That's why we've created a SaaS...
0
by: Rahul1995seven | last post by:
Introduction: In the realm of programming languages, Python has emerged as a powerhouse. With its simplicity, versatility, and robustness, Python...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.