2010-03-06 26 views
20

我想寫一個程序有一個字符數組的向量,我有一些問題。字符數組的C++向量

char test [] = { 'a', 'b', 'c', 'd', 'e' }; 

vector<char[]> v; 

v.push_back(test); 

很抱歉,這已經是一個字符數組,因爲我需要能夠產生字符的名單,因爲我想獲得的輸出類似。

一個一個 A B 一個C 一個d A E B A B C

任何人都可以點我在正確的方向?

感謝

+0

忘記載體,只使用std :: string。然後你可以使用+ =向它添加更多的字符。 – Tronic 2010-03-06 11:50:12

+0

我不需要添加字符,我需要先將字符更改爲數組中的下一個字符。 – aHunter 2010-03-15 21:28:15

回答

57

您不能將數組存儲在向量中(或任何其他標準庫容器中)。標準庫容器存儲的內容必須是可複製和可分配的,而數組既不是這些。

如果你真的需要在一個向量中放置一個數組(你可能不需要 - 使用向量的矢量或者向量的字符串更可能是你所需要的),那麼你可以將數組包裝在一個結構中:

struct S { 
    char a[10]; 
}; 

,然後創建結構的一個矢量:

vector <S> v; 
S s; 
s.a[0] = 'x'; 
v.push_back(s); 
+2

數組如何不可複製或分配? – quantum231 2016-06-23 23:39:53

11

你需要

char test[] = "abcde"; // This will add a terminating \0 character to the array 
std::vector<std::string> v; 
v.push_back(test); 

如果你的意思是讓字符而不是字符串矢量的載體,

std::vector<char> v(test, test + sizeof(test)/sizeof(*test)); 

表達sizeof(test)/sizeof(*test)是計算數數組測試中的元素。

+0

使用這個怎麼會push_back另一個測試實例添加到現有的矢量? – aHunter 2010-03-06 11:38:54

2

使用std::string代替炭陣列

std::string k ="abcde"; 
std::vector<std::string> v; 
v.push_back(k); 
+0

雖然這可能對此實現非常有效,但根據我的理解,std :: string實現不保證具有連續的內存存儲。如果有人使用它來接收流並使用這個解決方案,它*可能是一個問題。而且,如果你在流中有'NULL'字符,你會遇到std :: string的問題。 – enthusiasticgeek 2014-02-24 13:34:40

2

您可以使用boost::array做到這一點:

boost::array<char, 5> test = {'a', 'b', 'c', 'd', 'e'}; 
std::vector<boost::array<char, 5> > v; 
v.push_back(test); 

編輯:

或者你可以使用向量的向量,如下圖所示:

char test[] = {'a', 'b', 'c', 'd', 'e'}; 
std::vector<std::vector<char> > v; 
v.push_back(std::vector<char>(test, test + sizeof(test)/ sizeof(test[0]))); 
-1

可以存儲陣列中的向量但在2011年之後的C++版本中,字符數組更應該是字符串數據類型。但是您仍可以通過以下方式執行此操作:

char test [] = { 'a', 'b', 'c', 'd', 'e' }; 
vector<char> v; 
for(int i=0;i<5;i++) 
v.push_back(test[i]); 
0

您可以直接定義一個字符類型向量,如下所示。

vector<char> c = {'a', 'b', 'c'}; 
vector < vector<char> > t = {{'a','a'}, 'b','b'};