我想可以帮助您的是Boost.Optional。
我有一个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
}
我该怎么做?
预先感谢。
我不完全确定您的意思是“不提供任何值”,但如果您的意思是未明确分配值,则执行]
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]同样,您可以创建一个临时浮点数以将其初始化为地图。
我想可以帮助您的是Boost.Optional。
/ *我不想这样做,因为实际上我不使用浮点类型* /
似乎您真的想要一个std :: set或std ::: list列表,然后在该集合上进行迭代以创建您的地图。
您可以尝试制作一个临时浮点数或任何数据类型,然后使用它初始化地图的值。
std::set