如何交换地图元素

时间:2010-11-20 09:02:18

标签: c++ stl map swap

在C ++中,我如何交换map的两个元素?

6 个答案:

答案 0 :(得分:5)

提供的答案是正确的,但是对于相同的密钥使用operator[]两次,这不是免费的,可以避免:

std::map<char, std::string> a;

解决方案1:

std::string &item1 = a['a'];
std::string &item2 = a['b'];
std::swap(item1, item2);

解决方案2:

const std::map<char, std::string>::iterator item1 = a.find('a');
const std::map<char, std::string>::iterator item2 = a.find('b');
if ((item1 != a.end()) && (item2 != a.end()))
    std::swap(item1->second, item2->second);

当然,这两个解决方案并不等效(解决方案2只交换已经在地图中的值,解决方案1插入而不会产生疑问,最终可能会交换两个默认构造的字符串)。

答案 1 :(得分:3)

我认为std::swap()是一个不错的选择。

答案 2 :(得分:1)

你在地图上交换是什么意思?普通的普通香草地图没有任何特定的顺序,所以说到交换对订单没有任何意义。

如果您正在寻找保留顺序的C ++地图实现,在这种情况下,排序变得有意义,那么请查看here

但是,如果您要将与一个键相关联的值与与第二个键相关联的值进行交换,那么只需执行

  map<char,string> mymap;

  mymap['a']="firstValue";
  mymap['b']="SecondValue";
  /*now let's swap*/
  string tmpString = mymap['a'];
  mymap['a']=mymap['b'];
  mymap['b']= tmpString

答案 3 :(得分:1)

到目前为止,所提供的答案都没有涉及不存在的密钥,并且保留了这些密钥的不存在。

template<class Key, class Value>
void swap_map_elements(std::map<Key, Value>& map, const Key& key1, const Key& key2)
{
    auto it1 = map.find(key1);
    auto it2 = map.find(key2);
    auto end = map.end();

    if(it1 != end && it2 != end) {
        std::swap(it1->second, it2->second);
    }
    else if(it1 != end) {
        map.emplace(std::make_pair(key2, std::move(it1->second)));
        map.erase(key1);
    }
    else if(it2 != end) {
        map.emplace(std::make_pair(key1, std::move(it2->second)));
        map.erase(key2);
    }
}

示例:

auto M = std::map<int, std::string>();
M.emplace(std::make_pair(1, "one"));
M.emplace(std::make_pair(2, "two"));

swap_map_elements(M, 1, 2); // 1: "two", 2: "one"
swap_map_elements(M, 1, 4); // 2: "one", 4: "two"
swap_map_elements(M, 5, 2); // 4: "two", 5: "one"
swap_map_elements(M, 8, 9); // 4: "two", 5: "one"

答案 4 :(得分:0)

你是说这个吗?

const T tmp = map["a"];
map["a"] = map["b"];
map["b"] = tmp;

答案 5 :(得分:0)

  auto mymap = std::map<int, char>{{1, 'a'}, {2, 'b'}};
  std::swap(mymap.at(1), mymap.at(2));