Строка к перечислению в C++

Вы можете линеаризовать решение, предложенное @HansHirse, поэтому небольшое улучшение может быть таким:

% Dummy data
A = rand(20, 3);
b = ceil(rand(20, 1) * 4);
% color vector
c = [0 1 0; 0 0 1; 0 1 1; 1 0 0];
% Use the linear indexing to select the right color
scatter3(A(:,1),A(:,2),A(:,3),[],c(b,:),"filled")

Еще проще, вы можете просто использовать b в качестве ввода цвета, и Matlab будет использовать цветовую карту по умолчанию для установки цвет в соответствии с b

scatter3(A(:,1),A(:,2),A(:,3),[],b,"filled")
17
задан bluish 27 November 2012 в 09:02
поделиться

6 ответов

Можно настроить карту, которую можно использовать много раз:

template <typename T>
class EnumParser
{
    map <string, T> enumMap;
public:
    EnumParser(){};

    T ParseSomeEnum(const string &value)
    { 
        map <string, T>::const_iterator iValue = enumMap.find(value);
        if (iValue  == enumMap.end())
            throw runtime_error("");
        return iValue->second;
    }
};

enum SomeEnum
{
    Value1,
    Value2
};
EnumParser<SomeEnum>::EnumParser()
{
    enumMap["Value1"] = Value1;
    enumMap["Value2"] = Value2;
}

enum OtherEnum
{
    Value3, 
    Value4
};
EnumParser<OtherEnum>::EnumParser()
{
    enumMap["Value3"] = Value3;
    enumMap["Value4"] = Value4;
}

int main()
{
    EnumParser<SomeEnum> parser;
    cout << parser.ParseSomeEnum("Value2");
}
31
ответ дан 30 November 2019 в 10:50
поделиться
std::map< string, enumType> enumResolver;
9
ответ дан 30 November 2019 в 10:50
поделиться

Я согласовываю со многими ответами это std::map самое легкое решение.

При необходимости в чем-то быстрее можно использовать карту хеша. Возможно, Ваш компилятор уже предлагает один, такой как hash_map или предстоящий стандарт unordered_map, или можно добраться один от повышения. Когда все строки знаются заранее, идеальное хеширование может использоваться также.

3
ответ дан 30 November 2019 в 10:50
поделиться

Используя a std::map поднимает вопрос: как карта становится инициализированной? Я использовал бы функцию:

enum E { A, B };

E f( const std::string & s ) {
   if ( s == "A" ) {
      return A;
    }
    else if ( s == "B" ) {
      return B;
    }
    else {
      throw "Your exception here";
    }
}
1
ответ дан 30 November 2019 в 10:50
поделиться

Проанализируйте строку сами, соответствуйте строке значению (который является также индексом к a map<string, enum>.

0
ответ дан 30 November 2019 в 10:50
поделиться

Взгляд на Повышение. Bimap, это обеспечивает двунаправленные ассоциации между двумя множествами значений. Можно также выбрать базовый контейнер.

2
ответ дан 30 November 2019 в 10:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: