2011-06-14 56 views
4

我已經寫了一個小程序:複製數組到載體

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"}; 

但相同的代碼運行良好的窗口,沒有任何問題 我使用HPUX編譯ACC

請幫助 。!編輯 下面是堆轉儲的堆棧跟蹤。

(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 
+0

這是什麼'uninitialized_copy'的堆棧跟蹤?你是否在展示導致這次事故的競爭計劃?另外,我會在gcc中嘗試這個,如果它工作的比你可能在aCC上有問題(這是非常古老的,不是嗎?HPUX正在逐步淘汰AFAIK) – davka 2011-06-14 11:39:53

+0

@davka:這是一個庫的實現細節,I在STL實現中已經看到具有該名稱的函數將構造從一組迭代器複製到某些未初始化的內存中。 – 2011-06-14 12:00:48

+0

@davka'uninitialized_copy'可能是由'std :: vector'的構造函數調用的。 – 2011-06-14 12:02:29

回答

5

爲什麼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", 
    // ... 
}; 
+0

我更喜歡'fields(&a [0 ],&a [sizeof(a)/ sizeof(a [0])])'爲了便於閱讀。 – kay 2011-06-14 11:26:39

+0

因爲數組包含75個字符串,並且它是固定的,將永遠不會改變 – Vijay 2011-06-14 11:28:04

+0

@Rahul您是否嘗試過應用我的修復程序?您提供給我們的代碼與其無關。這種硬編碼價值是維護時間炸彈,在維護之前似乎已經消失了。 – 2011-06-14 11:29:30

4

嘗試const char* a[]而不是char* a[]。字符串文字的類型爲const char*,而不是char*,因此您會收到警告。

+0

你說得對.Warnings現在消失了..但是核心轉儲仍然存在 – Vijay 2011-06-14 11:21:25

+4

實際上,文字是'const char []',它衰變爲'const char *' – rubenvb 2011-06-14 11:24:38

2

下面是可能的解決方案,它是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")); 
} 
+1

你甚至可以刪除顯式'v',只是'return std :: vector ...'。另外,你可以製作第二個版本,它需要一個明確的大小參數來適應不是編譯時常量大小的數組。 – 2011-06-14 15:47:50

+0

@Kerrek SB - 是的,進一步的模板化/改進是可能的,甚至建議。我把它作爲練習去做 – mloskot 2011-06-14 16:23:40