如何在不为std :: map指定值的情况下添加有效键?

问题描述 投票:8回答:5

我有一个std :: map,我想添加一个有效的键以在以后对其进行迭代,但是不提供任何值(它将在迭代过程中稍后给出)。

这是我现在的做法:

std::vector<std::string> valid_keys;
//Fill... Then :
std::map<std::string, float> map;
for(size_t i = 0 ; i < valid_keys.size() ; ++i) {
    /*I don't want to do that because in fact I don't use a float type*/ 
    map[valid_keys[i]] = 0.f; //<- 
}
//Using :
for(std::map<std::string, float>::iterator it = map.begin() ; it != map.end() ; ++it) {
    it->second = 0; //Dummy
}

我该怎么做?

预先感谢。

c++ map
5个回答
11
投票

我不完全确定您的意思是“不提供任何值”,但如果您的意思是未明确分配值,则执行]

map[valid_keys[i]];

这仍然有效,即,如果以前没有那个键,它将在地图中创建一个新条目。 operator[]只是返回对该值的引用,以便您可以为其分配一个新值,但是请记住,它是已经]默认构造的。

另一方面,如果您想表达不存在任何有意义的值,并且随后可能会或可能不会收到有效值,请参阅@UncleBens` answer

我想可以帮助您的是Boost.Optional

#include <boost/optional.hpp>
#include <map>

class CantConstructMe
{
    CantConstructMe() {}
};

int main()
{
    std::map<int, boost::optional<CantConstructMe> > m;
    m[0];
}

缺少可用的默认构造函数不是问题,默认情况下,optional将为空。

/ *我不想这样做,因为实际上我不使用浮点类型* /

然后用std::map代替std::set

似乎您真的想要一个std :: set或std ::: list列表,然后在该集合上进行迭代以创建您的地图。

如果出于某种原因这是不可接受的,则可以用实现操作符float()的某种类型的对象包装float,并为float提供各种转换函数,但也要带有“ good()”标记或类似的符号。] >

如果最终值实际上是浮点型的,则可以将其初始化为+/- NaN作为简单的占位符。

我会说boost :: optional是生产代码的更好选择,但这取决于您的要求。

您可以尝试制作一个临时浮点数或任何数据类型,然后使用它初始化地图的值。

std::set

如您在本例中看到的,我制作了一个临时映射m以将其初始化为hen [s]同样,您可以创建一个临时浮点数以将其初始化为地图。


7
投票

我想可以帮助您的是Boost.Optional


5
投票

/ *我不想这样做,因为实际上我不使用浮点类型* /


0
投票

似乎您真的想要一个std :: set或std ::: list列表,然后在该集合上进行迭代以创建您的地图。


0
投票

您可以尝试制作一个临时浮点数或任何数据类型,然后使用它初始化地图的值。

std::set
© www.soinside.com 2019 - 2024. All rights reserved.