【问题标题】:I want to exchange the values of map as follows but its not working我想按如下方式交换地图的值,但它不起作用
【发布时间】:2020-04-10 08:57:18
【问题描述】:

这里 i 是一个指针,所以我也可以递增和递减,但是如果我按照代码中提到的那样进行减法操作,它就不起作用

for(auto i = soldier.begin();i!=soldier.end();i++){

        int temp1 = i->first;
        int temp2 = i->second;

        i->first = (i-temp2)->first;
        i->second = (i-temp2)->second;

        (i-temp2)->first = temp1;
        (i-temp2)->second = temp2;

    }

【问题讨论】:

  • 你不能做i->first = (i-temp2)->first;,你不能在迭代过程中改变map的键
  • 那么有没有其他办法呢
  • 我不太明白地图中的“交换”是什么意思,你想交换什么?在map 中,访问是通过键完成的,您不应该将其与索引一起使用。
  • 另外,地图值类型是std::pair<const Key, T>。因为Key 是const,所以你不应该修改它。
  • 更准确地说:std::map 将键与值关联,交换键 值是完全没有用的。例如:key1=>value1 和 key2=>value2,然后你交换两者,最终得到 exact same 关联。这听起来像XY-problem

标签: c++ oop stl


【解决方案1】:

这里 i 是一个指针,所以我也可以递增和递减,但是如果我做减号操作,它就不起作用

i 在您的代码中是一个迭代器,而不是一个指针。您不能递减前向迭代器。

按照问题标题的目标,您只能通过创建迭代器来交换与映射 soldier 中的键有关的值,以使用 std::map::find() 搜索两个键,然后使用 std::swap() 交换:

std::map<DT1, DT2> soldier;

// insert elements (key,value)

// create iterators over the associative map container with your required data types for <key,value> :

const std::map<DT1, DT2>::iterator i1 = soldier.find(key1);
const std::map<DT1,DT2>::iterator i2 = soldier.find(key2);

// you can use auto as well:
//  auto i1 = soldier.find(key1);
//  auto i2 = soldier.find(key2); 

if ((i1 != soldier.end()) && (i2 != soldier.end()))
   { std::swap(i1->second, i2->second);
   }

这将交换映射中key1key2 之间对应键的值。您没有提到用于地图中键值对的数据类型(也没有在代码中显示),因此我提供了数据类型 DT1DT2 的通用答案。

注意:

  • 使用 std::map::find 搜索键 (find(const key&amp; key)) 并且不能与值一起使用。
  • 您不能使用迭代器来交换两个键。交换键和值(也如 churill 所述)也毫无意义,因为这意味着您只需更改 &lt;key,value&gt; 对的顺序。

&lt;int ,std::string&gt; 键值对映射的示例:

#include <iostream>
#include <iterator>
#include <map>
int main()
{
   std::map<int,std::string> soldier;
   soldier[1]="Soldier1";
   soldier[2]="Soldier2";

   const std::map<int ,std::string>::iterator i1 = soldier.find(1);
   const std::map<int ,std::string>::iterator i2 = soldier.find(2);

   if ((i1 != soldier.end()) && (i2 != soldier.end()))
   { std::swap(i1->second, i2->second);
   }

  std::map<int,std::string>::iterator it;
  for(it=soldier.begin(); it!=soldier.end(); ++it)
     std::cout<<it->first<<" "<<it->second<<"\n";

     // 1 Soldier2
     // 2 Soldier1

  return 0;
}

【讨论】:

    【解决方案2】:

    只要交换元素,只需要operator[],但要确定元素存在:

    map<int, int> m;
    m.insert(std::pair<int, int>(1,100));
    m.insert(std::pair<int, int>(2,1000));
    
    // change
    int temp = m[1];
    m[1] = m[2];
    m[2] = temp;
    

    【讨论】:

      猜你喜欢
      • 2021-09-17
      • 2013-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-29
      • 2014-12-28
      • 2022-12-05
      相关资源
      最近更新 更多