2013-10-11 4 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 인 경우 알고리즘이 있습니까?

것을 제외하고는 : 그러나 나는 내가 접근 만 STL 맵을 사용하는 것, 내가 STL 벡터에 STL 맵 변환의 생각

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

가능한 모든 조합 맵의 값 (하지 키)을 원하는

+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

@ P0W 나는 당신의 관점을 본다. – aaronman

+0

@ P0W 그가 Cartesian 제품을 원한다면 분명히 그는지도를 사용해서는 안됩니다 – 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

관련 문제