копирование массивов строк в C ++ - PullRequest
2 голосов
/ 11 марта 2011

У меня есть массив переменных типа string.Что-то вроде:

std::string Array1[3] = {"A","B","C"}; 

Я хотел бы скопировать содержимое этого массива в другой:

std::string Array2[3]; 

В данный момент я использую цикл для этого.Есть ли более простой / альтернативный способ?Также, если я объявлю и инициализирую переменную следующим образом:

if( ... check some condition ... ) 
{
    .
    .
    std::string Array1[3] = {"A","B","C"}; 
}  

, она, очевидно, будет уничтожена после выхода из области действия оператора if.Есть ли способ избежать этого, чтобы его можно было использовать позже в функции.В идеале я бы хотел избежать объявления глобальной переменной Array1.

Спасибо

Ответы [ 3 ]

5 голосов
/ 11 марта 2011

Нет, с массивом сложных объектов вам нужен цикл, или вы можете обернуть цикл с помощью std::copy:

std::string Array1[3] = { "A", "B", "C" };
std::string Array2[3];
std::copy(Array1, Array1 + 3, Array2);

Однако я предлагаю использовать более канонический std::vector, который имеетродное задание (см. этот SO ответ о способах заполнения std::vector):

std::vector<std::string> Array1, Array2;
Array1.push_back("A"); Array1.push_back("B"); Array1.push_back("C");
Array2 = Array1;

Или, по крайней мере, boost::array (std::array, если вы 'на C ++ 0x, std::tr1:array или аналогичных на TR1-совместимых инструментальных цепочках, таких как недавние MSVS), что является статически распределенным эквивалентом, который также может быть назначен:

using boost::array; // swap as appropriate
array<std::string, 3> Array1 = {{ "A", "B", "C" }}; // yes, I used two
array<std::string, 3> Array2 = Array1;
2 голосов
/ 11 марта 2011

Вы можете использовать std::copy (и большинство алгоритмов) с указателями, и массивы легко распадаются на указатели, так что вы можете сделать что-то вроде этого, чтобы избежать развертывания собственного цикла (гарантируя, что размеры правильны):

std::string src[3] = { "A", "B", "C" };
std::string dst[3];
std::copy( src, src + 3, dst );

Во второй части вопроса я не совсем понимаю, что вы хотите сделать. Либо массив является локальным для области действия, либо нет, если он является локальным для области действия, вы не можете использовать его вне этой области, если он требуется в области действия функции, просто объявите его там.

0 голосов
/ 11 марта 2011

Попробуйте использовать std::vector также:

std::string strs[3] = {"A","B","C"};  //from your code!

std::vector<std::string> strvector(strs, strs+3); //improvement!

Или,

std::vector<std::string> strvector; //declare 

//later on!
std::copy(strs, strs+3, std::back_inserter(strvector)); //improvement!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...