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

时间:2010-08-26 16:10:42

标签: c++ map

我有一个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
}

我该怎么办?

先谢谢。

5 个答案:

答案 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] 同样,您可以创建一个临时浮点数,将其初始化为地图。