471,122 Members | 1,059 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

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

Copying from maps to lists or vectors

I have a map like this:

typedef boost::shared_ptr<NodeNodePtr;
typedef std::vector<NodePtrNodeVecPtr;
typedef std::map<std::string, NodePtrNodeMap;
typedef std::map<std:string, NodePtr>::iterator NodeMapItr;

NodeMap nmap;

In my classes, I often find myself copying the second arguments of
maps to lists/vectors like this.

NodeVecPtr nodes;
for (NodeMapItr itr = nmap.begin(); itr != nmap.end(); ++itr)
nodes.push_back(itr->second);

I may also have node be a list of NodePtrs as opposed to vectors. I'm
wondering if there is some standard STL routines, I can use to try to
reduce this kind of code being repeated. I now std::copy() exists but
it takes iterators. But since I'm dealing with maps, I'm not sure how
to pass the second value as an iterator. There is also
std::transform() but that also works with iterators.

I've been searching the web, and found stuff like boost::bind and
boost::iterator_adaptors that might work but I'm trying to read up the
documentation to figure out the syntax.

If somebody can help me in showing how I could accomplish this using
STL/boost features, this will be helpful. Thanks for you time.

Apr 17 '07 #1
5 1714
pallav wrote:
I have a map like this:

typedef boost::shared_ptr<NodeNodePtr;
typedef std::vector<NodePtrNodeVecPtr;
typedef std::map<std::string, NodePtrNodeMap;
typedef std::map<std:string, NodePtr>::iterator NodeMapItr;

NodeMap nmap;

In my classes, I often find myself copying the second arguments of
maps to lists/vectors like this.

NodeVecPtr nodes;
for (NodeMapItr itr = nmap.begin(); itr != nmap.end(); ++itr)
nodes.push_back(itr->second);
NodeVecPtr nodes( nmap.begin(), nmap.end() );

or

nodes.append( nmap.begin(), nmap.end() );

I don't know if std::list has an append method, but it does have an
insert method that works like append.
>
I may also have node be a list of NodePtrs as opposed to vectors. I'm
wondering if there is some standard STL routines, I can use to try to
reduce this kind of code being repeated. I now std::copy() exists but
it takes iterators. But since I'm dealing with maps, I'm not sure how
to pass the second value as an iterator. There is also
std::transform() but that also works with iterators.

I've been searching the web, and found stuff like boost::bind and
boost::iterator_adaptors that might work but I'm trying to read up the
documentation to figure out the syntax.

If somebody can help me in showing how I could accomplish this using
STL/boost features, this will be helpful. Thanks for you time.
Apr 17 '07 #2
On Apr 17, 4:58 pm, Gianni Mariani <gi3nos...@mariani.wswrote:
pallav wrote:
I have a map like this:
typedef boost::shared_ptr<NodeNodePtr;
typedef std::vector<NodePtrNodeVecPtr;
typedef std::map<std::string, NodePtrNodeMap;
typedef std::map<std:string, NodePtr>::iterator NodeMapItr;
NodeMap nmap;
In my classes, I often find myself copying the second arguments of
maps to lists/vectors like this.
NodeVecPtr nodes;
for (NodeMapItr itr = nmap.begin(); itr != nmap.end(); ++itr)
nodes.push_back(itr->second);

NodeVecPtr nodes( nmap.begin(), nmap.end() );

or

nodes.append( nmap.begin(), nmap.end() );

I don't know if std::list has an append method, but it does have an
insert method that works like append.
But the map and the vector have different value_types, so this won't
work.

Cheers! --M

Apr 17 '07 #3
On Apr 17, 2:55 pm, pallav <pallavgu...@gmail.comwrote:
I have a map like this:

typedef boost::shared_ptr<NodeNodePtr;
typedef std::vector<NodePtrNodeVecPtr;
typedef std::map<std::string, NodePtrNodeMap;
typedef std::map<std:string, NodePtr>::iterator NodeMapItr;

NodeMap nmap;

In my classes, I often find myself copying the second arguments of
maps to lists/vectors like this.

NodeVecPtr nodes;
for (NodeMapItr itr = nmap.begin(); itr != nmap.end(); ++itr)
nodes.push_back(itr->second);

I may also have node be a list of NodePtrs as opposed to vectors. I'm
wondering if there is some standard STL routines, I can use to try to
reduce this kind of code being repeated. I now std::copy() exists but
it takes iterators. But since I'm dealing with maps, I'm not sure how
to pass the second value as an iterator. There is also
std::transform() but that also works with iterators.

I've been searching the web, and found stuff like boost::bind and
boost::iterator_adaptors that might work but I'm trying to read up the
documentation to figure out the syntax.

If somebody can help me in showing how I could accomplish this using
STL/boost features, this will be helpful. Thanks for you time.
I don't have time to work up a complete solution here, but here's a
snippet from Karlsson's Boost book (pp. 260f):

void print_string( const std::string& s ) {
std::cout << s << '\n';
}

// ...

std::map<int, std::stringmy_map;
my_map[0] = "Boost";
my_map[1] = "Bind";
std::for_each(
my_map.begin(),
my_map.end(),
boost::bind( &print_string, boost::bind(
&std::map<int,std::string>::value_type::second, _1)
)
);

That should get you started.

Cheers! --M

Apr 17 '07 #4
mlimber wrote:
On Apr 17, 4:58 pm, Gianni Mariani <gi3nos...@mariani.wswrote:
>pallav wrote:
But the map and the vector have different value_types, so this won't
work.
Ya - missed that one.

OK - how about an interator that derefs to the second element ?
psuedo code :

template <typename T>
struct second_iterator
{

T m_iterator;

second_iterator( const T& i_iterator );

typename T::second_type & operator*()
{
return m_iterator->second;
}

....
};

template <typename T>
second_iterator<Tmake_second_iterator( const T & i_iterator )
{
return second_iterator<T>( i_iterator );
}

.... and then you can write:

NodeVecPtr nodes(
make_second_iterator( nmap.begin() ),
make_second_iterator( nmap.end() )
);
Apr 17 '07 #5
On Apr 17, 8:55 pm, pallav <pallavgu...@gmail.comwrote:
I have a map like this:
typedef boost::shared_ptr<NodeNodePtr;
typedef std::vector<NodePtrNodeVecPtr;
typedef std::map<std::string, NodePtrNodeMap;
typedef std::map<std:string, NodePtr>::iterator NodeMapItr;
NodeMap nmap;
In my classes, I often find myself copying the second arguments of
maps to lists/vectors like this.
NodeVecPtr nodes;
for (NodeMapItr itr = nmap.begin(); itr != nmap.end(); ++itr)
nodes.push_back(itr->second);
I may also have node be a list of NodePtrs as opposed to vectors. I'm
wondering if there is some standard STL routines, I can use to try to
reduce this kind of code being repeated. I now std::copy() exists but
it takes iterators. But since I'm dealing with maps, I'm not sure how
to pass the second value as an iterator. There is also
std::transform() but that also works with iterators.
I've been searching the web, and found stuff like boost::bind and
boost::iterator_adaptors that might work but I'm trying to read up the
documentation to figure out the syntax.
If somebody can help me in showing how I could accomplish this using
STL/boost features, this will be helpful. Thanks for you time.
Wouldn't something like the following work:

template< typename Map >
struct ValueFromMap
: public std::unary_function< typename Map::value_type,
typename Map::mapped_type >
{
typename Map::mapped_type operator()(
typename Map::value_type const&
elem ) const
{
return elem.second ;
}
} ;

typedef boost::transform_iterator< ValueFromMap< NodeMap >,
NodeMap::const_iterator >
ValueIter ;

(I tried it with a std::map< std::string, int >, and it seemed
to work.)

--
James Kanze (GABI Software) email:ja*********@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Apr 18 '07 #6

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

7 posts views Thread by Craig Storey | last post: by
12 posts views Thread by Fred Ma | last post: by
5 posts views Thread by roberts.noah | last post: by
10 posts views Thread by ballpointpenthief | last post: by
9 posts views Thread by Jess | last post: by
7 posts views Thread by mavrik | last post: by

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.