常用数据结构及对应操作

1.std::map
Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力。map内部自建一颗红黑树(一 种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的。

  • map构造
#include <map>

std::map<std::string, int> myMap;
  • map插入
 1. insert函数插入pair数据
myMap.insert (std::pair<std::string, int>("a", 1));

 2. insert函数插入value_type数据
myMap.insert (map<std::string, int>::value_type ("b", 2));

 3. 数组方式插入
myMap[1] = 3;

 4. range insertion
  std::map<char,int> anothermap;
  anothermap.insert(myMap.begin(),myMap.find('c'));
  • map遍历
std::map<std::string, int>::iterator tempItr;
   for (tempItr = myMap.begin(); tempItr != myMap.end(); ++tempItr) {
      std::cout << tempItr->first << " and " << tempItr->second << std::endl;
   }

//Or

for (auto itr = myMap.begin(); itr != myMap.end(); ++itr) {
      std::cout << itr->first << " and " << itr->second << std::endl;
   }
  • map查找元素
//用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器
//查找map中是否包含某个关键字条目用find()方法,传入的参数是要查找的key
std::map<std::string, int>::iterator itr;

itr = myMap.find("a");
std::cout << itr->first << std::endl << itr->second << std::endl;
  • map删除
std::map<std::string, int>::iterator itr = myMap.find("a");
myMap.erase(itr)

c++中map与unordered_map的区别 头文件 map: #include < map > unordered_map:
#include < unordered_map > 内部实现机理 map: map内部实现了一个红黑树,该结构具有自动排序的功能,因此map内部的所有元素都是有序的,红黑树的每一个节点都代表着map的一个元素,因此,对于map进行的查找,删除,添加等一系列的操作都相当于是对红黑树进行这样的操作,故红黑树的效率决定了map的效率。
unordered_map: unordered_map内部实现了一个哈希表,因此其元素的排列顺序是杂乱的,无序的 优缺点以及适用处 map
优点: 有序性,这是map结构最大的优点,其元素的有序性在很多应用中都会简化很多的操作
红黑树,内部实现一个红黑书使得map的很多操作在lgnlgn的时间复杂度下就可以实现,因此效率非常的高 缺点:
空间占用率高,因为map内部实现了红黑树,虽然提高了运行效率,但是因为每一个节点都需要额外保存父节点,孩子节点以及红/黑性质,使得每一个节点都占用大量的空间
适用处,对于那些有顺序要求的问题,用map会更高效一些 unordered_map 优点: 因为内部实现了哈希表,因此其查找速度非常的快
缺点: 哈希表的建立比较耗费时间
适用处,对于查找问题,unordered_map会更加高效一些,因此遇到查找问题,常会考虑一下用unordered_map note:
对于unordered_map或者unordered_set容器,其遍历顺序与创建该容器时输入元素的顺序是不一定一致的,遍历是按照哈希表从前往后依次遍历的
原文:https://blog.csdn.net/batuwuhanpei/article/details/50727227


  • Map insert之后的返回值
    一个键-值pair形参的insert版本将返回一个值:包含一个迭代器和一个bool值得pair对象,其中迭代器指向map中具有相应键的元素,而bool值则表示是否插入了该元素
DeviceSubsessionMap::iterator deviceSubsessionItr = m_deviceSubsessionMap.find(oldDeviceName);

if (!m_deviceSubsessionMap.insert(DeviceSubsessionMap::value_type(newDeviceName, deviceSubsessionItr->second)).second) {
         throw nNISLSCSHAREDCMN::InternalError("Unable to update device subsession map", NIERR_LOCATION);
      }

上述代码map insert之后返回一个类型:

pair<map<string,deviceSubsession >::iterator,bool>

iterator表示插入的位置,bool表示插入是否成功。

2. boost::make_shared
#include <boost/smart_ptr/shared_ptr.hpp>

3. weak_ptr
weak_ptr由share_ptr创建,通过lock()返回原shared_ptr.

vector<int> v{1,2,3,4,5};
shared_ptr<vector<int>> shptr = make_shared<vector<int>>(v);
weak_ptr<vector<int>> wptr(shptr);
shared_ptr<vector<int>> org = wptr.lock();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值