4

考虑一下我有这个:

std::map<int, int> intMap;
intMap[11] = 21; 
intMap[12] = 22; 
intMap[13] = 23; 
intMap[14] = 24; 

int val = 0; 

当我想找到 map[11] 的值时,如果存在,并将其放入val我正在使用:

std::map<int, int>::iterator it = intMap.find(11);
if(it != intMap.end())  
    val = it->second;

有没有办法在不使用迭代器的情况下做到这一点?我的意思是,一种更短的方式。

int val = intMap[11]对我来说不是一个选择,因为它添加 11 作为 intMap 的键,如果它还没有的话,我不感兴趣。看这里

4

4 回答 4

8

c++11 map中,有一个新方法被调用,它将返回对映射值的引用,或者如果映射中不存在at(Key)则抛出异常。Key

c++中,您将需要一个中间迭代器。

于 2013-06-06T12:20:00.503 回答
3

André 已经提到了新at()功能。在其他情况下,以下可能有用:

template <typename Map, typename K, typename T>
T get(Map &map, const K &key, T def) {
    typename Map::const_iterator it = map.find(key);
    return (it == map.end() ? def : it->second);
}

像这样使用它:

int val = get(intMap, 11, 0);

您还可以拥有一个const版本,其优点是返回引用(非常量版本返回一个值,因为返回对默认值的引用相当有限):

template <typename Map, typename K, typename T>
const T& get(const Map &map, const K &key, const T &def) {
    typename Map::const_iterator it = map.find(key);
    return (it == map.end() ? def : it->second);
}

只是为了好玩,这段代码很简洁,但为了清晰可能会丢失。它会按照您在下面的评论中所说的进行:11在地图中没有的情况下什么都没有:

BOOST_FOREACH(const std::pair<int,int> &newval, intMap.equal_range(11)) {
    val = newval.second;
}
于 2013-06-06T12:32:20.343 回答
2

我猜这也可以工作:

int val;
if (intMap.count(11)) val = intMap[11];

简单检查密钥的存在...

因此,按照 Karadoc 的建议,在带有 default_value 的单行中:

int val = (intMap.count(x) ? intMap[x] : default_value);
于 2013-06-06T12:22:37.127 回答
0

通常,您必须以某种方式检查密钥的存在。但是,您可以编写一些函数来进行检查并给出值,因此当您调用它时,您将拥有一个单行。当地图中不存在该键时,您将需要一些默认值。这是一个快速的实现:

template <class Map, class U>
auto getOrDefault(Map const& m, typename Map::key_type const& key, U&& default_val) 
  -> typename Map::mapped_type
{
  auto pos = m.find(key);
  return pos != m.end() ? pos->second : std::forward<U>(default_val);
}

template <class Map>
auto getOrDefault(Map const& m, typename Map::key_type const& key) 
  -> typename Map::mapped_type
{
  typedef typename Map::mapped_type Value;
  return getOrDefault(m, key, Value{});   
}

//call:
int val = getOrDefault(intMap, 11);       // 0 if key 11 does not exist
int val2 = getOrDefault(intMap, 42, -1);  //-1 if key 42 does not exist

注意:我没有设法给出default_val默认参数 - 也许有人可以帮助我解决这个问题。U当我尝试使用时,gcc 4.7.2 无法推断U&& default_val = typename Map::mapped_type{}

于 2013-06-06T12:47:41.933 回答