2014-10-10 2 views
1

У меня есть вопросы о инициализации C++.C++ String Инициализация векторов

В Java: если я хочу пустой StringBuffer, я должен использовать

StringBuffer sb = new StringBuffer(); 

инициализировать пустой буфер строки.

В C++: Если я хочу использовать пустую строку, я могу просто объявить

std::string str; 

или std::string str = "";

В реальных проектах я должен всегда писать как вторую форму?

Как насчёт объявить о пустых векторах?

vector<int> vec; 

В порядке? или я должен дать некоторые нулевые значения для этого vec?

+0

Это, вероятно, лучше для programers.stackexchange.com, так как это открытый вопрос. Тем не менее, на мой взгляд, вектор отлично подходит для общего использования, использует его функции-члены, такие как 'push_back', чтобы добавить членов и позволить ему обрабатывать остальные. Что касается строки, если вы собираетесь добавить в пустую строку, я бы явно назначил ее для удобочитаемости, но в остальном она не нужна. – IllusiveBrian

+0

Большое вам спасибо за ваш ответ. Причина, по которой я спрашивал об этом, заключается в том, что несколько месяцев назад, когда я взял интервью у работы, интервьюер спросил меня о том, почему я не инициализировал пустой вектор, поэтому мне интересно, как инициализировать это на C++. – user2840454

+0

Не путайте его с 'vector * vec = new vector ()', который более или менее аналогичен вашему примеру Java. Здесь вы инициализируете указатель на местоположение выделенного («нового») вектора. Если вы только пишете 'vector vec;' это распределение стека, которое происходит автоматически. – leemes

ответ

4

станд: строка и станд: вектор классы, а не основных типов: Это означает, что в отличие от целого числа, которое в качестве псевдослучайного значения в декларации момент, строки и векторы имеют четко определенное начальное значение.

Значение по умолчанию для std :: string равно "".

По умолчанию для std :: vector является {}.

Вы можете использовать то, что предпочитаете, но инициализация не требуется и даже не очень оптимальна.

+0

Огромное вам спасибо !, так что если я хочу нулевые значения C++ базовых типов, я должен всегда присваивать значение? Http: //msdn.microsoft.com/en-us/library/cc953fe1.aspx – user2840454

+0

Да, вы всегда должны инициализировать их, если у вас нет оснований не делать этого. – leemes

+0

@leemes: любая причина для этого? зачем инициализировать строку до ""? –

1
  1. std :: string str (""); Он выполняет прямую инициализацию и использует конструктор string (const char *).

  2. std :: string str = ""; Выполняет инициализацию копии.

  3. std :: string str; Создает пустую строку.

Вариант 3 аналогичен другим и менее накладным. Используйте его Подробнее о разнице здесь What's the motivation behind having copy and direct initialization behave differently?

+0

Итак, если я использую вариант 3, он будет принят в проектах? – user2840454

+0

Да, это лучший выбор. –

Смежные вопросы