【问题标题】:C++ initialize keys only in std::mapC++ 仅在 std::map 中初始化键
【发布时间】:2018-04-05 13:21:27
【问题描述】:

我正在寻找一种方法来仅初始化 std::map 中的第一个值,然后根据键初始化第二个值。这是我的代码:

#pragma once
#include <string>
#include <map>

class Student
{
public:

    Student(
        double Score_Maths,
        double Score_Eng,
        double Score_Chem,
        double Score_Bio,
        double Score_His
        );
    ~Student();


private:

    std::string Surname;
    std::map<std::string, double> Subject_Scores = { {"Maths"}, {"English"}, {"Chemistry"}, {"Biology"}, {"History"} };

};

我想要做的是,已经在类中拥有这些键,然后使用构造函数初始化值,但是在初始化映射时当然会显示错误,有什么帮助吗?

【问题讨论】:

  • 您应该能够为每个值提供默认值:std::map&lt;std::string, double&gt; Subject_Scores = { {"Maths", 0.0}, {"English", 0.0}, {"Chemistry", 0.0}, {"Biology", 0.0}, {"History", 0.0} };
  • @UlrichEckhardt 虽然这段代码技术上可能会更小一些,但我想说这已经是一个相当不错的 MCVE。
  • 所以不使用一些预先分配的值是不可能的?
  • @Nick 是的。您不能分配没有值的键,反之亦然
  • 从技术上讲,如果您将值设为optional&lt;double&gt;,它实际上可能没有值,而不仅仅是一个神奇的“无效”值。但这似乎很复杂,没有太多回报。

标签: c++ class stdmap


【解决方案1】:

使用构造函数初始化值

你可以直接在构造函数中做这两件事:

https://godbolt.org/g/hWhcxu

class Student
{
public:

    Student(
        double Score_Maths,
        double Score_Eng,
        double Score_Chem,
        double Score_Bio,
        double Score_His
        )
        :
        Subject_Scores({ {"Maths", Score_Maths},
                         {"English", Score_Eng},
                         {"Chemistry", Score_Chem},
                         {"Biology", Score_Bio},
                         {"History", Score_His} })
    {
    }
    ~Student();

private:
    std::map<std::string, double> Subject_Scores;
}

这仍可确保您的地图在整个类生命周期内有效并已初始化。

【讨论】:

  • 这可能是我要做的,因为 c++ 似乎没有我要搜索的内容。
  • 我正在考虑如何将地图本身传递给构造函数以实现可伸缩性。如果主题集发生变化怎么办?我们会继续并继续改变班级吗?设计?
  • @SauravSahu 设计方面我认为这是合适的。您甚至可以添加更多具有不同课程的构造函数而无需更改,例如一个简单的打印输出功能。它在可扩展性方面不是很好,但也没有将一组固定的分数传递给构造函数。
【解决方案2】:

您可以编写一个(静态)函数来做到这一点:

 std::map<std::string, double> Student::createMap( const std::vector<std::string> &v )
 {
     std::map<std::string, double> r;
     for( const auto &key : v ) r[ key ];
     return r;
 }

然后在你的班级:

     std::map<std::string, double> Subject_Scores = createMap( { "Maths", "English", "Chemistry", "Biology", "History" } );

【讨论】:

  • +1 表示语法与我想要做的相似,但它仍然为值分配 0.0,这是我不希望发生的。但似乎我的票没有被计算在内。
  • @Nick 你为什么不希望这种情况发生?问题是:如果你想要一个只包含键而没有值的容器,那么它就不是地图。
  • @user463035818 我已经在我的其他 cmets 中写过这个
  • 听什么?当您使用 map 并且不想要任何值时 - 不要插入该键,就这么简单。看起来你想要一些你不明白的东西。
  • 闻起来像xy problem
猜你喜欢
  • 1970-01-01
  • 2010-09-13
  • 2015-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-05
  • 2015-11-10
相关资源
最近更新 更多