如何在c ++ 11 / c ++ 14中将键作为枚举和值定义为整数?

时间:2016-02-17 09:32:54

标签: c++ c++11 dictionary enums c++14

enum Symbols
{
    BAR,
    BELL,
    PLUM,
    ORANGE,
    CHERRY,
    DOESNOTMATTER,
}wheel1, wheel2, wheel3;

map<Symbols[3], int> symb = {{{BAR, BAR, BAR}, 250},
                              {{BELL, BELL, BELL}, 20},
                              {{BELL, BELL, BAR}, 20},
                              {{PLUM, PLUM, BAR}, 14},
                              {{PLUM, PLUM, PLUM}, 14},
                              {{ORANGE, ORANGE, BAR}, 10},
                              {{ORANGE, ORANGE, ORANGE}, 10},
                              {{CHERRY, CHERRY, CHERRY}, 7},
                              {{CHERRY, CHERRY, DOESNOTMATTER}, 5},
                              {{CHERRY, DOESNOTMATTER, DOESNOTMATTER}, 2}};

我已经定义了一个名为Symbols的枚举器。我正在尝试创建一个地图,其关键是符号枚举数组,值是整数。

当我尝试运行此程序时,出现错误“ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c ++ / v1 / utility:268:11:数组初始值设定项必须是初始化列表“。

我在这里做错了什么?我也试过插入这些值。错误是一样的。

4 个答案:

答案 0 :(得分:4)

原始数组Symbols[3]与容器的要求不匹配std::map的关键字类型。

  

std :: map符合Container,AllocatorAwareContainer,AssociativeContainer和ReversibleContainer的要求。

请参阅C++ concepts: Container

CopyInsertable
EqualityComparable
Destructible 

您可以使用std::arraystd::vector。如:

std::map<std::array<Symbols, 3>, int> symb = ...

LIVE

答案 1 :(得分:1)

您无法执行此操作的原因是原始数组不可复制或可分配,并且mapvectorset等需要复制操作。 请改用:

std:array<Symbol,3>

答案 2 :(得分:1)

对于地图,Key至少需要:

  • 可复制
  • less Comparable

为实现这一目标,我将通过一个结构:

struct key
{
    Symbol k1;
    Symbol k2;
    Symbol k3;

    key(Symbol _k1, Symbol _k2, Symbol _k3):
        k1(_k1), k2(_k2), k3(_k3)
    {}
    key(key const &) = default;
    key(key &&) = default;
    key &operator=(key const &) = default;
    key &operator=(key &&) = default;

    bool operator<(key const & rhs)
    {
       // perform less operation between this and rhs
    }
};

答案 3 :(得分:0)

这样可行:

#include <iostream>
#include <map>
#include <array>

enum Symbols
{
  BAR,
  BELL,
  PLUM,
  ORANGE,
  CHERRY,
  DOESNOTMATTER,
};

void main()
{
  std::map<std::array<Symbols,3>, int> symb ( { 
    { { Symbols::BAR, Symbols::BAR, Symbols::BAR }, 250 }
  } );
  std::array<Symbols, 3> bar_sym = { Symbols::BAR, Symbols::BAR, Symbols::BAR };
  std::cout << symb[bar_sym] << std::endl;
  }