欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

查找、删除map和vector容器中指定元素、emplace、insert

程序员文章站 2022-03-01 22:18:21
...

1.查找与删除map和vector容器中指定元素

(1) map

查找map的关键字:

std::map<std::string,int> map_name_;

auto iter = map_name_.find("key_name");
if (iter != map_name_.end()) {
   //找到了该关键字,进行的操作
}
删除map的指定key值

有两种方法:
方法1:直接删除key
map_name_.erase("key_name");

方法2:使用迭代器删除

auto iter = map_name_.find("key_name");
if (iter != map_name_.end()) {
  map_name_.erase(iter);  //删除
}

(2) vector

删除vector的指定元素"123"

方法1:使用迭代器
不同于map(map有find方法),vector本身没有find这一方法.

std::vector<std::string> vct_name_;
auto iter = vct_name_.begin();
while(iter != vct_name_.end()) {
  if(*iter=="123"){ 		 // 这命令可以作为查找vetor元素的方法
    vct_name_.erase(iter);	 // 删除
    //iter=vct_name_.erase(iter); //也可以这么写
  }
}

方法2:使用 std::remove_if

std::vector<std::string> vct_name_;
vct_name_.erase(std::remove_if(vct_name_.begin(),vct_name_.end(),[](std::string str) { return str == "123"; }),vct_name_.end());

2. map 的insert和emplace方法

参考地址: https://www.cnblogs.com/khacker/p/10479801.html
对于std::mapstd::unordered_mapinsert(std::make_pair(key, value))emplace(std::make_pair(key, value))重复插入同一个key的操作,二者都不会替换原先的key对应的value值,只有索引[]操作会改变value。

    std::unordered_map<int, int > map;
    map.insert(std::make_pair(1, 1));
    map.insert(std::make_pair(2, 2));
    map.insert(std::make_pair(3, 3));
    map.insert(std::make_pair(1, 4)); //这一步并不会改变key为1的value值,仍旧是1,不会变为4
	std::unordered_map<int, int > map;
    map.emplace(1, 1);
    map.emplace(2, 2);
    map.emplace(3, 3);
    map.emplace(1, 4);  //这一步并不会改变key为1的value值,仍旧是1,不会变为4
    map[1] = 1;
    map[2] = 2;
    map[3] = 3;
    map[1] = 4; //这句话会改变key为1的value值,变为4

3. map的erase(iter)需注意,和vector不一样

https://blog.csdn.net/zhangyueweia/article/details/50293965

#include <iostream>
#include <map>
#include <string>
#include <vector>

// g++ -std=c++11 main.cpp -o main

int main() {
  // std::vector可以直接删除iter后不影响遍历
  std::vector<std::string> name_vct = {"Alibaba", "Baidu", "CMD", "DDS",
                                       "Ella"};
  std::vector<std::string>::iterator it = name_vct.begin();
  while (it != name_vct.end()) {
    std::cout << "*it= " << *it << std::endl;
    if (*it == "CMD") {
      name_vct.erase(it);
      std::cout << "erase后 *it= " << *it << std::endl;
    } else {
      ++it;
    }
  }

  std::cout << std::endl;

  std::map<std::string, int> name_age_map = {
      {"AAA", 21}, {"Bob", 22}, {"Cool", 23}, {"Daisy", 24}};

  /**  下面这种方式会出错。 std::map 删除iter后继续遍历会造成double free **/
  /*
    auto it0 = name_age_map.begin();
    while (it0 != name_age_map.end()) {
      std::cout << "key= " << it0->first << std::endl;
      if (it0->first == "Bob") {
        name_age_map.erase(
            it0);
    //当这条语句执行完后,it1就是一个非法指针,如果再执行++就会出错. std::cout
    << "erase后 it->first= " << it0->first << std::endl; } else {
        ++it0;
      }
    }
  */

  /** --方法1
   * std::map删除iter需要这么使用,使用一个临时变量保存迭代器后,将迭代器自增1
   **/
  /*
   while  (it1 != name_age_map.end()) {
     std::cout << "key= " << it1->first << std::endl;
     if (it1->first == "Bob") {
       auto iter_tmp = it1;
       ++it1;
       name_age_map.erase(iter_tmp);
       std::cout << "erase后 iter_tmp->first= " << iter_tmp->first <<
       std::endl; std::cout << "erase后 it->first= " << it1->first <<
       std::endl;
     } else {
       ++it1;
     }
   }
   */

  /** --方法2
   * std::map删除iter需要这么使用,it2 = name_age_map.erase(it2);
   **/
  /*
 auto it2 = name_age_map.begin();
 while (it2 != name_age_map.end()) {
   std::cout << "key= " << it2->first << std::endl;
   if (it2->first == "Bob") {
     it2 = name_age_map.erase(it2);
     std::cout << "erase后 it->first= " << it2->first << std::endl;
   } else {
     ++it;
   }
 }
*/

  /** --方法2
   * std::map删除iter需要这么使用,name_age_map.erase(it3++);
   **/

  auto it3 = name_age_map.begin();
  while (it3 != name_age_map.end()) {
    std::cout << "key= " << it3->first << std::endl;
    if (it3->first == "Bob") {
      name_age_map.erase(it3++);
      std::cout << "erase后 it->first= " << it3->first << std::endl;
    } else {
      ++it3;
    }
  }
}
相关标签: c++