2015-08-07 2 views
3

Так что я знаю, что могу установить каждое значение массива на «магическое число» (в данном случае магическую строку) во время построения типа;Установите все значения существующего массива на «магические числа»

string * myArray[] = {"foo", "bar", "baz"}; 

Что было бы полезно, если бы я мог объявить свой массив;

string * myArray[100]; 

Затем более поздняя (в выражении if) устанавливает свои значения;

myArray = {"foo", "bar", "baz"}; 

(фактический массив будет содержать ~ 30 магические строки, так что я не хочу, чтобы назначить им все по одному)

Я понимаю, что магические числа (или магические строки) не являются хорошими , Однако система, в которой я работаю, - это корень CERN, который наполнен интересными эксцентриситетами, и я бы предпочел больше не терять время на поиск более аккуратного подхода. Поэтому в интересах не выпускать perfect become the enemy of the good Я собираюсь использовать магические числа.

Какой здесь самый быстрый вариант?

Редактировать; Принятый ответ отлично подходит для C++ 11. Если, как и я, у вас нет такого варианта, вот очень неприятное, но функциональное решение. (Программисты с чувствами, пожалуйста, защитить ваши глаза.)

int numElements; 
vector<char *> myArray; 
if(someCondition){ 
    numElements = 3; 
    string * tempArray[] = {"foo", "bar", "baz"}] 
    for(int n = 0; n < numElements; n++){ 
    const char * element = (tempArray[n]); 
    myArray.push_back(element); 
    } 
}else if(anoutherCondition){ 
//More stuff 
} 
+3

почему бы не использовать вектор ? – marom

+4

Почему указатели на строки –

+0

Не могли бы это сделать, но это поможет? Мы все еще не можем установить как '= {" foo "," bar "," baz "}' Я думаю? – Jekowl

ответ

3

Хотя встроенные массивы не позволяют агрегированных присвоений, std::vector позволяет сделать это:

vector<string> data; 
if (someCondition) { 
    data = {"quick", "brown", "fox"}; 
} else { 
    data = {"jumps", "over", "the", "lazy", "dog"}; 
} 

Demo.

Этот подход имеет несколько преимущества:

  • Синтаксис компактный и интуитивно понятный itive
  • Назначенные агрегаты допускают разную длину
  • Ресурсы, выделенные std::vector, освобождаются автоматически.
+0

Получаю ошибку из этого - ее длинный, хотя так ее в нижней части вопроса. – Jekowl

+0

@Jekowl Вы должны скомпилировать как (по крайней мере) C++ 11. – emlai

+0

@Jekowl Этот синтаксис доступен в C++ 11 и C++ 14, поэтому вам может потребоваться включить специальный флаг в ваш компилятор (при условии, что ваш компилятор поддерживает C++ 11 или выше). – dasblinkenlight

2

Я думаю, что вы, вероятно, имели в виду массив std::string, а не массив std::string*, как это:

std::string myArray[] = {"foo", "bar", "baz"}; 

Путь я хотел бы сделать это, чтобы позволить std::vector управлять массив для меня. Это позволяет мне легко копировать, перемещать или менять новые значения в дальнейшем:

std::vector<std::string> myVector = {"foo", "bar", "baz"}; 

myVector = {"wdd", "ghh", "yhh"}; 
Смежные вопросы