2013-07-24 28 views
1

I'ld喜歡以創建經過不通過參考一個std :: string要修改的功能,傳遞的std :: string的陣列通過引用

void changeStr(std::string &str) 
{ 
    str = "Hello World!"; 
} 

,而是整個,固定std :: strings的大小數組(該函數將完全相同:將一些特定的字符串指定給數組中的每個空間)。但我不知道哪個是合適的語法...

回答

4

以下是操作方法!

//Change the 10 to whatever size you'd like 
void changeStr(std::string (&str)[10]) { 
} 

這當然是一個靜態的大小,其他的答案,但是,是更好方法完成你需要的靈活性是什麼。

+0

其實這就是我需要的。我同意,考慮到靈活性,其他方法更好,但我正在考慮預先固定大小的陣列,所以您的答案最終是最簡單和最好的。謝謝! (並感謝其他人!) – Momergil

+0

我很高興能幫上忙! –

6

一種方法是將參考傳遞給std::array<std::string, N>,其中N是數組的大小。您可以使用函數模板來推斷N

#include <array> 

template <size_t N> 
void changeStr(std::array<std::string, N>& strings) 
{ 
    // access strings[i] for i >= 0 and i < N 
} 

或者,您也可以通過固定尺寸的普通陣列,再次使用函數模板:

template<size_t N > 
void changeStr(std::string (&strings)[N]) 
{ 
    // access strings[i] for i >= 0 and i < N 
} 

注意,模板是必要在這裏允許函數來處理不同大小的固定大小的數組。該模板允許您保留尺寸信息,而不必擔心它的實際價值。

+0

[模板是沒有必要的](http://coliru.stacked-crooked.com/view?id=fc95cd562800c051b92d067de4b3444c-76514b8f9424a3be7ad7d477f762fdd0) –

+0

@MooingDuck ehm,什麼?怎麼沒有必要? – juanchopanza

+0

這不是必須的,因爲'std :: string [10]'的_reference_不會衰減到指針。看看我的代碼在哪裏編譯並且不允許傳入一個'std :: string [3]'。 –

7

由於您使用的是C++,因此您可能希望通過引用傳遞值的集合,而不是通過引用引用集合。實現這一目標的最簡單方法是使用std::vector<T>

void changeStr(std::vector<std::string>& collection) { 
    if (collection.size() > 0) { 
    collection[0] = "hello world"; 
    } 
} 
+0

*收藏[0] *? .....如果'收集'是空的呢? – Nawaz

+3

@Nawaz它是一個示例代碼,顯示如何修改集合,並不意味着100%正確的代碼 – JaredPar

+4

而不是'collection.size()> 0','!collection.empty()'聽起來更好。;-) – Nawaz

1
void changeStr(std::string pStrings[], int num) 

可以傳遞任何尺寸的任何C數組。如果changeStr函數需要知道大小,則需要將其作爲大小參數傳遞。 請注意,我個人更喜歡使用矢量。