2012-03-09 59 views
2

例如,map1將從某個地址(開始到結束)取值1到10。 我想有值10〜1對應於MAP2地址(開始完)我如何將地圖的反向複製到另一張地圖?

map<long , int* > v; 
map<long , int* > rv; 

int i,a[10]; 
for(i=0; i<10; i++) 
{ 
a[i] = i+1; 
v.insert(pair<long, int *>(i+1,&a[i])); 
} 
itr = v.begin(); 
while(itr != v.end()) 
{ 
cout << itr->first << " "<<itr->second; 
cout << endl; 
itr++; 
} 
rv.insert(v.rbegin(),v.rend()); 
cout << "copied array: "<<endl; 
itr = rv.begin(); 
while(itr != rv.end()) 
{ 
cout << itr->first << " "<<itr->second; 
cout << endl; 
itr++; 
} 

我嘗試了上述之一,但我得到的值1至10 only..my預期值10到1 請幫助我找出....

+0

pair tempPair;長x = 0; int * p = NULL; map :: reverse_iterator r = v.rbegin(); while(r!= v.rend()){x = r-> first; p =(int *)r-> second; cout << x <<「」<< p; cout << endl; tempPair(X,P); rv.insert(tempPair); [R ++; }我試圖這樣做,但爲此,我得到錯誤「錯誤:沒有匹配調用'(std :: pair )(long int&,int *&)'編譯終止' – Raj 2012-03-09 15:07:23

+2

地圖排序依據它的關鍵。 – PlasmaHH 2012-03-09 15:19:28

+0

@Raj:您的評論中的錯誤是因爲您在實際擁有初始值之前過早用C風格定義'tempPair'。只要寫'pair tempPair(x,p)'來定義它,當你有初始值的時候。 – MSalters 2012-03-09 15:24:37

回答

8

STL地圖是一個有序的容器。您在迭代期間獲得的項目順序與您將項目插入容器的順序無關。

  • 鍵的值,並
  • Compare類作爲模板參數傳遞給map

可以遍歷:

迭代的順序是由兩個因素決定地圖的順序相反(你的代碼片斷顯示你已經知道它是如何完成的)。反向迭代映射的性能損失(如果有的話)可以忽略不計。您還可以提供非默認的Comparestd::greater<long>而不是默認的std::less<long>)以更改默認的迭代順序。

+1

「您也可以提供非默認比較」。該解決方案的實現[在這裏](http://ideone.com/6phnN)。 – 2012-03-09 15:31:51

+0

@Rob謝謝.. – Raj 2012-03-11 16:43:40

0

地圖通過增加值進行排序(由運營商<指定),因此無論您如何插入元素,它們都會按排序順序返回。你當然在做相反的插入操作,但是每個放置的元素都按正確的升序排列。

1

這是不可能的,因爲std::map訂購關聯容器。如果要保留插入順序,請使用其他容器,例如std::liststd::vector