unordered_map

std::unordered_map()

template < class Key,                                    // unordered_map::key_type
           class T,                                      // unordered_map::mapped_type
           class Hash = hash<Key>,                       // unordered_map::hasher
           class Pred = equal_to<Key>,                   // unordered_map::key_equal
           class Alloc = allocator< pair<const Key,T> >  // unordered_map::allocator_type
           > class unordered_map;

无序映射是关联容器,其存储由键值和映射值的组合形成的元素,并且允许基于其键快速检索各个元素。

在unordered_map中,键值通常用于唯一标识元素,而映射值是具有与此键关联的内容的对象。键和映射值的类型可能不同。

无序映射实现直接访问运算符(operator []),允许使用其键值作为参数直接访问映射值。

unordered_map容器的迭代器指向此value_type的元素。因此,对于一个名为it的迭代器,它指向一个map的元素,它的键和映射值可以分别用:

unordered_map<Key,T>::iterator it;
(*it).first;             // the key value (of type Key)
(*it).second;            // the mapped value (of type T)
(*it);                   // the "element value" (of type pair<const Key,T>)

或者可以这样访问它:

it->first;               // same as (*it).first   (the key value)
it->second;              // same as (*it).second  (the mapped value)

构造函数:

empty (1)
explicit unordered_map ( size_type n = /* see below */,
                         const hasher& hf = hasher(),
                         const key_equal& eql = key_equal(),
                         const allocator_type& alloc = allocator_type() );
explicit unordered_map ( const allocator_type& alloc );
range (2)
template <class InputIterator>
  unordered_map ( InputIterator first, InputIterator last,
                  size_type n = /* see below */,
                  const hasher& hf = hasher(),
                  const key_equal& eql = key_equal(),
                  const allocator_type& alloc = allocator_type() );
copy (3)
unordered_map ( const unordered_map& ump );
unordered_map ( const unordered_map& ump, const allocator_type& alloc );
move (4)
unordered_map ( unordered_map&& ump );
unordered_map ( unordered_map&& ump, const allocator_type& alloc );
initializer list (5)
unordered_map ( initializer_list<value_type> il,
                size_type n = /* see below */,
                const hasher& hf = hasher(),
                const key_equal& eql = key_equal(),
                const allocator_type& alloc = allocator_type() );

关于范围构造函数:将 InputIterator迭代器指定范围[ first, last) 内值,作为参数赋给构造函数,函数模板类型可以是任何类型的输入迭代器

例子:

#include<iostream>
#include<unordered_map>
#include<string>

typedef std::unordered_map<std::string,std::string> stringmap;

stingmap merge(stringmap a, stringmap b)
{
    stringmap temp(a);temp.insert(b.begin(),b.end());return temp;
}
int main()
{
    stringmap first; //empty
    stringmap second( {{"apple", "red"},{"lemon","yellow"}});
    stringmap third ( {{"orange","orange"},{"strawberry","red"}} );  // init list
    stingmap fourth(second);
    stringmap fifth(merge(third,first));
    sringmap sixth(fifth.begin(),fifth.end());

    std::cout << "sixth contains:";
    for (auto& x: sixth) std::cout << " " << x.first << ":" << x.second;
    std::cout << std::endl;
    
    return 0;
}

unordered_map::at()

mapped_type& at ( const key_type& k );
const mapped_type& at ( const key_type& k ) const;

返回对unordered_map中带有键k的元素的映射值的引用。 如果k与容器中任何元素的键不匹配,则该函数抛出out_of_range异常。

例子:

// unordered_map::at
#include <iostream>
#include <string>
#include <unordered_map>

int main ()
{
  std::unordered_map<std::string,int> mymap = {
                { "Mars", 3000},
                { "Saturn", 60000},
                { "Jupiter", 70000 } };

  mymap.at("Mars") = 3396;
  mymap.at("Saturn") += 272;
  mymap.at("Jupiter") = mymap.at("Saturn") + 9638;

  for (auto& x: mymap) {
    std::cout << x.first << ": " << x.second << std::endl;
  }

  return 0;
}

unordered_map::begin()

container iterator (1)
      iterator begin() noexcept;
const_iterator begin() const noexcept;
bucket iterator (2)
      local_iterator begin ( size_type n );
const_local_iterator begin ( size_type n ) const;

 返回指向unordered_map容器(1)或其中一个存储桶(2)中的第一个元素的迭代器。请注意,unordered_map对象不保证哪个特定元素被视为其第一个元素。但是,在任何情况下,从开始到结束的范围都涵盖容器(或存储桶)中的所有元素,直到无效。

参数: n --桶号码。这应低于bucket_count。它是一个可选参数,用于更改此成员函数的行为:如果设置,则检索到的迭代器指向存储桶的第一个元素,否则它指向容器的第一个元素。

返回值:返回指向容器的第一个元素或者桶的第一个元素。

例子:

#include <iostream>
#include <unordered_map>
int main()
{
    std::unordered_map<std::string,std::string> mymap;
    mymap={ {""Australia","Canberra"},{"U.S.","Washington"},{"France","Paris"}};
    
    std::cout<<"mymap contains:";
    for(auto it=mymap.begin();it!=mymap.end();it++)
        {std::cout<<" "<<it->first<<" :"<<it->second;
    std::cout<<"mymap's buckets contains:";
    for(unsigned int i=0;i<mymap.bucket_count();i++){
        std::cout<<"bucket #"<<i<<"contains:";
        for(auto loacl_it=mymap.begin(i);it!=mymap.end(i);it++)
            std::cout<<" ”<<local_it->first<< ":"<<local_it->second;
        std::cout<<std::endl;
        }
    return 0;
} 

Possible output:

mymap contains: France:Paris Australia:Canberra U.S.:Washington
mymap's buckets contain:
bucket #0 contains:
bucket #1 contains:
bucket #2 contains:
bucket #3 contains:
bucket #4 contains:
bucket #5 contains: France:Paris
bucket #6 contains:
bucket #7 contains: Australia:Canberra
bucket #8 contains: U.S.:Washington
bucket #9 contains:
bucket #10 contains:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值