2011-03-11 95 views
2

我有一個字符串類型的變量數組。喜歡的東西:在C++中複製字符串數組

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

我想這個數組的內容複製到另一個問題:

std::string Array2[3]; 

目前我使用一個循環做到這一點。有沒有任何 更簡單/替代方法?另外,如果我聲明並初始化變量 如下:

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

會明顯被破壞,一旦離開if語句的範圍。有沒有 避免這種方式,以便它可以稍後在函數中使用。理想情況下,我想避免聲明變量Array1 global。

感謝

回答

5

沒有,複雜對象的數組,你需要一個循環,或者你可以用與std::copy循環:

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

不過,我建議使用更規範std::vector,其中有本地分配(見this SO回答的方式來填充std::vector):

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

或者,至少是,boost::arraystd::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; 
+0

我敢肯定的std ::陣列在TR1。至少,Visual Studio包含在tr1中。 – 2011-03-11 11:53:36

+0

@dauphic:作爲'std :: tr1 :: array',是的。雖然精確的命名空間因實現而異。 – 2011-03-11 11:55:20

2

您可以使用std::copy(最算法)的指針和數組容易衰變爲指針,所以你可以做這樣的事情,以避免展開自己的循環(確保尺寸是正確的):

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

在問題的第二部分,我不完全明白你想要做什麼。無論是否爲範圍的本地數組,如果它是本地的範圍,你不能在範圍外使用它,如果你需要它在函數範圍,只需在那裏聲明它。

0

嘗試使用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! 
+0

http://stackoverflow.com/questions/4679059/stdvector-hex-values/4679107#4679107可能重複:P – 2011-03-11 12:00:08

+0

@Tomalak:然後投票結束它:D – Nawaz 2011-03-11 12:04:44

+0

無法遵守,嘗試除以零 – 2011-03-11 12:13:07