2013-02-26 2 views
0

Я довольно новичок в C++, так что простите меня, если это глупый вопрос, но я искал, и я нашел что-то около std::find, который, кажется, не делает то, что я хочу (возможно, я не использую его правильно).Если строка в массиве делает это?

В качестве примера, скажем, у меня есть базовая программа, которая может хранить ваш пол. У меня есть, если заявление, что просто проверяет, если пользователь ввел «мужской» или «мужской», а затем делает все, что я хочу, чтобы это сделать, например, так:

if(gender == "male" || gender == "Male"){ 
    // Do stuff 
} 

Я хотел бы, чтобы развернуть его, так что пользователь может ввести «m» или «M», и он будет обнаружен как мужчина. Тем не менее, я считаю, что если заявление будет немного грязным, так что я думаю о торчащих вариантах в простой массив и делают:

if(gender is in maleArray){ 
    // Do stuff 
} 

Возможен ли это? Я не слишком беспокоюсь о каких-либо плохих практиках, поскольку это учебный сценарий, хотя любые (полезные) критические замечания или альтернативы оценены, как примеры!

Заранее благодарю, надеюсь, что я достаточно четко дал понять.

+4

'std :: find' будет делать то, что вы хотите. –

+0

Можете ли вы отправить пример в качестве ответа? Кажется, я не могу понять это как условие if. – whitfin

+0

Так будет 'std :: string :: find'. –

ответ

4

Решение вы просите является:

std::array<std::string, 4> male_synonyms = {"Male", "male", "M", "m"}; 
auto it = std::find(male_synonyms.begin(), male_synonyms.end(), gender); 
if (it != male_synonyms.end()) { 
    // ... 
} 

std::find Он использует, чтобы увидеть, если пользовательский ввод gender находится в пределах последовательности строк male_synonyms. std::find возвращает итерационный код прошедшего конца, если он не найден, поэтому мы проверяем это.

Однако я предпочел бы это:

std::transform(gender.begin(), gender.end(), gender.begin(), std::tolower); 
if (gender == "m" || gender == "male") { 
    // ... 
} 

Это будет принимать нечувствительно к регистру m и male. Таким образом, MalE, M, mALE и т. Д. Также верны.

+1

Векторы хороши, потому что они динамически расширяются/сокращаются. Вы должны быть осторожны, потому что они могут сделать очень много перераспределения памяти, как я ее понимаю. – crush

+0

Вам может понадобиться 'static_cast (std :: lower)' для второго фрагмента для компиляции (если также отображается перегрузка 'tolower' от * *), – Praetorian

2

Если ваша проблема - бесполезность оператора if, вы можете иметь метод isMale(), который возвращает логическое значение. Затем вы можете использовать его, как если бы (isMale (пол)).

bool isMale(std::string gender) 
{ 
    if(gender == "male" || 
     gender == "Male" || 
     gender == "M" || 
     gender == "m"  ) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

Если вы не заботитесь о том случае, вы можете преобразовать гендерную строку для всех малых дел, а затем сравнить с «мужским» и «м».

+0

Как заставить его ввести нижний регистр? – whitfin

+1

Есть несколько методов, чтобы заставить строчные буквы, но это, пожалуй, лучший: http://stackoverflow.com/questions/313970/stl-string-to-lower-case – crush