Michael Sync
Michael Sync

Reputation: 5014

Iterator loop in C++

I've been googling for this for so long but I couldn't get the answer. The most of sample that I found are based on iterating with vector, map and etc..

I have the code below.

multimap<int, int>::iterator it = myMuliMap.find(1); 

Let's say I have three pairs that has key "1". I like to get those three pair from for loop.. I think that I can't use for(multimap::iterator anotherItr=myMuliMap.begin()..

The following code is in C#.. I like to get C++ version.. Thanks.

foreach(var mypair in it){
  Console.WriteLine(mypair.Key);
} 

Upvotes: 1

Views: 893

Answers (4)

JaredPar
JaredPar

Reputation: 755387

The function you're looking for is equal_range. This returns an iterator to all pairs in the map which match the specified key

auto range = myMultiMap.equal_range(1);
for ( auto it = range.first; it != range.second; ++it) {
 ...
}

EDIT

Version without auto

pair<multimap<int,int>::const_iterator,multimap<int,int>::const_iterator>> it = myMultiMap.equal_range(1);
for ( multimap<int,int>::const_iterator it = range.first;
      it != range.second;
      ++it) {
  ...
}

Upvotes: 4

diverscuba23
diverscuba23

Reputation: 2185

This will print out only the values found by

std::pair<std::multimap<int, int>::iterator, std::multimap<int, int>::iterator> result;
result = myMultimap.equal_range(1);

for(std::multimap<int,int>::iterator it = result.first; it != result.second; it++)
{
    std::cout << it->first << " = " << it->second << std:: endl;
}

Upvotes: 1

hkaiser
hkaiser

Reputation: 11521

Use std::equal_range():

int tolookfor = 1;
typedef multimap<int, int>::iterator iterator;
std::pair<iterator, iterator> p = 
    std::equal_range(myMuliMap.begin(), myMuliMap.end(), tolookfor);

for (iterator it = p.first; it != p.second ++it)
    std::cout << (*it).second << std::endl;

the multi_map's member function equal_range works similarily:

std::pair<iterator, iterator> p = 
    myMuliMap.equal_range(tolookfor);

Upvotes: 1

CB Bailey
CB Bailey

Reputation: 793017

You can use something like the following loop.

for (std::multimap<int, int>::iterator i  = myMultiMap.lower_bound(1);
                                       i != myMultiMap.upper_bound(1);
                                     ++i)
{
    std::cout << i->first << " => " << i->second << '\n';
}

This is valid in the current version of C++.

Upvotes: 0

Related Questions