2012-03-09 60 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