копирование массива в вектор - PullRequest
4 голосов
/ 14 июня 2011

Я написал небольшую программу:

void showrecord()
{
     char *a[]={ "O_BILLABLE_ACCOUNT","O_CUSTOMER_TYPE_INDICATOR",
                 "O_A_PARTY_MSISDN_ID","O_A_PARTY_EQUIPMENT_NUMBER",
                 "O_A_PARTY_IMSI","O_A_PARTY_LOCATION_INFO_CELL_ID",
                 ...  
               };

     vector<std::string> fields(a,a+75);

     cout<<"done!!!"<<endl;
}

int main()
{
     showrecord();
}

У меня есть массив строковых литералов, и я хочу, чтобы они были скопированы в вектор.Я не нашел другого простого способа сделать это :(. Или, если есть какой-либо прямой способ инициализации вектора без использования массива, это было бы очень полезно. Это дамп ядра после запуска исполняемого файла в Unix.Это дает мне предупреждение, хотя как:

Warning 829: "test.cpp", line 12 
# Implicit conversion of string literal to 'char *' is deprecated.
D_TYPE","O_VARCHAR_5","O_VARCHAR_6","O_VARCHAR_7","O_VARCHAR_8","O_VARCHAR_9"};

Но тот же код работает на Windows без проблем. Я использую компилятор aCC на HPUX.

Пожалуйста, помогите!* EDIT ниже - трассировка стека дампа.

(gdb) where
#0  0x6800ad94 in strlen+0xc () from /usr/lib/libc.2
#1  0xabc0 in std::basic_string<char,std::char_traits<char>,std::allocator<char>>::basic_string<char,std::char_traits<char>,std::allocator<char>>+0x20 ()
#2  0xae9c in std<char const **,std::basic_string<char,std::char_traits<char>,std::allocator<char>> *,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>::uninitialized_copy+0x60 ()
#3  0x9ccc in _C_init_aux__Q2_3std6vectorXTQ2_3std12basic_stringXTcTQ2_3std11char_traitsXTc_TQ2_3std9allocatorXTc__TQ2_3std9allocatorXTQ2_3std12basic_stringXTcTQ2_3std11char_traitsXTc_TQ2_3std9allocatorXTc____XTPPCc_FPPCcT118_RW_is_not_integer+0x2d8
    ()
#4  0x9624 in showrecord () at test.cpp:13
#5  0xdbd8 in main () at test.cpp:21

Ответы [ 3 ]

5 голосов
/ 14 июня 2011

Почему 75?

Измените

vector<std::string> fields(a,a+75);

на

vector<std::string> fields(a, a + sizeof a / sizeof *a);

Не существует, пожалуй, лучшего способа инициализации вашего вектора для C ++03, но для C ++ 0x у вас есть доступ к более удобному синтаксису, исключая массив C:

std::vector<std::string> fields {
    "O_BILLABLE_ACCOUNT",
    // ...
};
4 голосов
/ 14 июня 2011

Попробуйте const char* a[] вместо char* a[].Строковые литералы имеют тип const char*, а не char*, и, следовательно, вы получите предупреждение.

2 голосов
/ 14 июня 2011

Вот возможное решение, которое IMO немного более общее - использует многократно используемую функцию, которая работает со строковыми массивами любого размера:

#include <algorithm>
#include <iostream>
#include <iterator>
#include <string>
#include <vector>

template <typename Array, std::size_t Size>
std::vector<std::string> make_vector(Array (&ar)[Size])
{
    std::vector<std::string> v(ar, ar + Size);
    return v;
}

int main()
{
     char const* a[] = { "Aa","Bb", "Cc","Dd", "Ee","Ff" };

     // copy C-array to vector
     std::vector<std::string> fields = make_vector(a);

     // test
     std::copy(fields.begin(), fields.end(),
               std::ostream_iterator<std::string>(std::cout, "\n"));
}
...