【问题标题】:How to add valid key without specifying value to a std::map?如何在不为 std::map 指定值的情况下添加有效键?
【发布时间】:2010-08-26 16:10:42
【问题描述】:

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

请问我该怎么做?

先谢谢了。

【问题讨论】:

  • "/*我不想那样做,因为实际上我不使用浮点类型*/" 但是你定义了 std::map&lt;std::string, float&gt; 如果你不定义它为什么用浮点想要它存储花车?
  • 通过用红鲱鱼混淆它,尝试找出真正的问题是什么变得更有趣。如果这太容易了,那么您将不会欣赏其中的奥秘。

标签: c++ map


【解决方案1】:

我不完全确定您所说的“不提供任何值”是什么意思,但如果您的意思是不明确指定值,那么就这样做

map[valid_keys[i]];

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

另一方面,如果您的意思是您想要表示没有有意义的值,并且它随后可能会或可能不会收到有效值,请参阅@UncleBens` answer

【讨论】:

  • 我什至没有想到这一点(我感到羞耻),谢谢! @Binary worrier:对不起这个问题,我应该重新制定。
  • @Mister:map[key]; 等价于map[key] = value_type();。在您的示例中,这将是map["key"]=float();。将float 替换为任何其他类型(具有默认构造函数)。
【解决方案2】:

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

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

class CantConstructMe
{
    CantConstructMe() {}
};

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      您似乎真的想要一个 std::set 或 std::list 键,然后稍后迭代该集合以创建您的地图。

      如果由于某种原因这是不可接受的,您可以使用某种类型的对象来包装您的浮点数,该对象实现了运算符 float(),以及浮点数的各种转换函数,但也有一个“good()”标志或类似的东西。

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

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-04-22
          • 2013-09-12
          • 1970-01-01
          • 2011-08-28
          • 2011-07-12
          • 2020-02-11
          • 1970-01-01
          相关资源
          最近更新 更多