Я не касался C++ в течение очень долгого времени, и я уверен, что это можно сделать в одном лайнере.
У меня есть строковый day
который я хочу преобразовать в значение между 0-11. Я обычно делал что-то вроде этого
months = array('Jan', 'Feb', 'Mar', 'Apr' ...);
print months[day];
Но я не знаю, как это сделать в C++
Простой подход будет примерно таким:
vector<string> months = { "jan", "feb", "mar", "apr", "may", ... };
int month_number = 2;
cout << months[ month_number - 1 ] // it is month_number-1 because the array subscription is 0 based index.
Лучший, но более сложный и продвинутый подход - использовать std::map
как показано ниже:
int get_month_index( string name )
{
map<string, int> months
{
{ "jan", 1 },
{ "feb", 2 },
{ "mar", 3 },
{ "apr", 4 },
{ "may", 5 },
{ "jun", 6 },
{ "jul", 7 },
{ "aug", 8 },
{ "sep", 9 },
{ "oct", 10 },
{ "nov", 11 },
{ "dec", 12 }
};
const auto iter = months.find( name );
if( iter != months.cend() )
return iter->second;
return -1;
}
Использовать boost :: assign для создания std :: map
См. Http://www.boost.org/doc/libs/1_42_0/libs/assign/doc/index.html#map_list_of и http://www.cplusplus.com/reference/map/map/.
вы можете использовать простой переключатель или std :: map, это менее подробный
Вы можете использовать std::map
чтобы написать такую функцию:
int GetMonthIndex(const std::string & monthName)
{
static const std::map<std::string, int> months
{
{ "Jan", 0 },
{ "Feb", 1 },
{ "Mar", 2 },
{ "Apr", 3 },
{ "May", 4 },
{ "Jun", 5 },
{ "Jul", 6 },
{ "Aug", 7 },
{ "Sep", 8 },
{ "Oct", 9 },
{ "Nov", 10 },
{ "Dec", 11 }
};
const auto iter(months.find(monthName));
return (iter != std::cend(months)) ? iter->second : -1;
}