我有一个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
}
我该怎么办?
先谢谢。
答案 0 :(得分:11)
我不完全确定你的意思是“没有给出任何价值”,但如果你的意思是没有明确指定一个值,那么就这样做
map[valid_keys[i]];
这仍然有效,即如果之前没有该条目,则它会在地图中创建一个新条目。 operator[]
只返回对该值的引用,以便您可以为其指定一个新值,但请记住已经已默认构建。
另一方面,如果您的意思是表示您想要表示没有任何有意义的价值,并且随后可能会或可能不会收到有效值,请参阅@UncleBens` answer。
答案 1 :(得分:7)
我认为可以帮助你的东西是Boost.Optional。
#include <boost/optional.hpp>
#include <map>
class CantConstructMe
{
CantConstructMe() {}
};
int main()
{
std::map<int, boost::optional<CantConstructMe> > m;
m[0];
}
缺少可用的默认构造函数不是问题,默认情况下optional
将为空。
答案 2 :(得分:5)
/ *我不想这样做,因为事实上我不使用浮点类型* /
然后使用std::set
而不是std::map
。
答案 3 :(得分:0)
看起来你真的想要一个std :: set或std :: key列表,然后再遍历那个集合来创建你的地图。
如果由于某种原因这是不可接受的,你可以用一些实现operator float()的对象包装你的float,以及float的各种转换函数,但也有一个“good()”标志或者某些东西。
如果你的最终值实际上是浮点数,你可以将值初始化为+/- NaN作为一个简单的占位符。
我想说boost :: optional是生产代码的更好选择,但它取决于您的要求。
答案 4 :(得分:0)
您可以尝试制作一个临时浮点数或任何数据类型,然后使用它来初始化地图的值。
#include <iostream>
#include <map>
#include <string>
#include <vector>
using namespace std;
int main()
{
map <string,map<int,vector<int>>> hen;
map<int ,vector<int>> m;
string s="egg";
hen[s]=m;
hen[s][1].push_back(5);
return 0;}
如您在本例中看到的,我制作了一个临时映射m以将其初始化为hen [s] 同样,您可以创建一个临时浮点数,将其初始化为地图。