2013-10-11 45 views
1

如何迭代STL映射以对抗所有元素。换句话说,我想找到所有可能的配对。我想要一个高效的算法(复杂性)。如何遍历STL映射(查找所有可能的对)

如果有STL向量,算法很简单。

vector<int> vInt; 
vector<pair<int, int> > vPair; 
for(int i = 0; i < vInt.size(); i++) { 
    for(int j = i + 1; j < vInt.size(); j++) { 
     vPair.push_back(make_pair(vInt[i], vInt[j])); 
    } 
} 

但是,如果你有一个STL映射是一样的算法?

观测值:我想

map<int, int> map; 
vector<pair<int, int> > vPair; 
??? 

我想转换到STL地图中的STL向量的所有可能的组合地图的值(不是键),不过,我想一种方法只使用STL地图

+0

通过定义对在地图数为N *(N-1)/ 2一张大小为n的地图。因此,没有比用于矢量的算法更高效的算法。 – john

+0

所有可能的配对或键或值的组合? – P0W

+0

我只想要的值 –

回答

0

我喜欢这种方法。

map<int, int> m; 
m[1] = 1; 
m[2] = 2; 
m[3] = 3; 
m[4] = 4; 
map<int, int>::iterator itr1; 
for(itr1 = m.begin(); itr1 != m.end(); ++itr1) { 
    map<int, int>::iterator itr2 = itr1; 
    for(++itr2; itr2 != m.end(); ++itr2) { 
     cout << m[itr1->second] << " : " << m[itr2->second] << endl; 
    } 
} 
1

非常简单的地图具有像矢量一样的开始和结束迭代器,所以你可以做到这一点。

#include <map>                  
int main()                   
{                     
    std::map<int,int> map;               
    for (auto p : map) {               
     auto f = p.first;               
     auto s = p.second;               
    }                    
    return 0;                  
}  

即使是std::unordered_map也有开始和结束迭代器,但它并不像地图一样保持顺序。

从你的问题中不清楚你是否想要向量中数字的笛卡尔乘积,我只能说如果那是你想要的,你的原始方法比使用地图更好。

+0

也许OP需要地图内的元素的所有可能组合 – P0W

+0

@PW我明白你的观点虽然很难说 – aaronman

+0

@ P0W显然如果他想要一个笛卡尔产品,他不应该使用地图 – aaronman

0

使用begin()end(),这两者都用于迭代vectormap的所有元素。

for (std::map<int, int>::iterator it = mymap.begin(); it != mymap.end(); ++it) 
{ 
    std::cout << it->first << " => " << it->second << '\n'; 
} 
2

“我希望所有可能的组合地图的值(不是键)”我不知道你想要什么

,但如果你想要做的完全一样你做了什么在您的示例矢量,在地图上的“价值”

你可以像以下:

std::map<int, int> map; 
std::map<int,int>::iterator i,j,end=m.end(); 
std::vector<std::pair<int,int> > vpair; 
end--; 
for(i=m.begin();i!=end;++i) 
{ 
    j=i; 
    j++; 
    for(;j!=m.end();++j) 
     vpair.push_back(std::make_pair(i->second,j->second)); 
} 
+0

我会使用'const_iterator'。 – Naszta

+1

@Naszta是的,这个想法只是为了展示它的可能性 – P0W