假設我有一個數組返回數組在C++中
int arr[] = {...};
arr = function(arr);
我有功能
int& function(int arr[])
{
//rest of the code
return arr;
}
我在做什麼在這裏錯?
假設我有一個數組返回數組在C++中
int arr[] = {...};
arr = function(arr);
我有功能
int& function(int arr[])
{
//rest of the code
return arr;
}
我在做什麼在這裏錯?
int& function(int arr[])
在此功能中ARR是一個指針,而且也沒有辦法再次打開它到一個數組。這是一樣的
int& function(int* arr)
int arr[] = {...};
arr = function(arr);
假設功能設法返回數組的引用,這仍然是行不通的。你不能分配給一個數組。在最好的情況,你可以將結果綁定到「X整數數組的基準」(使用一個typedef,因爲語法將變得非常難看,否則):
typedef int ten_ints[10];
ten_ints& foo(ten_ints& arr)
{
//..
return arr;
}
int main()
{
int arr[10];
ten_ints& arr_ref = foo(arr);
}
但是,它是完全不清楚的代碼在你的問題應該實現。對函數中的數組所做的任何更改對調用者都是可見的,所以沒有理由嘗試返回數組或將其分配回原始數組。
如果要一個固定大小的數組可以分配到和通過值傳遞(與被複制的內容),有std::tr1::array
(或boost::array
)。 std::vector
也是一個選項,但這是一個動態數組,因此不是一個確切的等價物。
數組傳遞和返回的語義可能相當混亂。改用std :: vector。
或boost :: array(如果可用)。 – Macke 2010-02-20 13:27:40
雖然這當然是好建議,但它甚至不能遠程回答問題** .. – 2010-02-20 13:58:29
@Andreas「我在這裏犯了什麼錯誤?」 - 不使用矢量的錯誤。 – 2010-02-20 13:59:43
您正在返回對int的引用,而不是對數組的引用。
你想:
(int*)& function(int arr[])
{
/// rest of the code
return arr;
}
儘管如此,正如其他人已經說過,這不是好的做法。
實際上,它返回一個指針的引用,而且'arr'也不是一個數組。 – 2010-02-20 13:56:23
除了@gf所說的,這也是一個語法錯誤。 – 2010-02-20 17:34:56
那麼,arr與int*
兼容,而不是int&
。你的代碼不會編譯。也許你想return arr[0]
?
您不能將數組分配給C++中的其他數組。考慮使用一個STL向量:http://www.cplusplus.com/reference/stl/vector/
正如其他人所說,有更好的選擇,如STL容器,最有趣的問題是爲什麼你需要返回數組到一個已經在範圍內的函數。
這就是說,不能傳遞或返回值數組和需要避免陣列衰減的指針(參見例如here),或者通過使用指針或引用它:
int (&f(int (&arr)[3]))[3]
{
return arr;
}
如果你不想硬編碼大小,你可以使用模板函數:
template<size_t n>
int (&f(int (&arr)[n]))[n]
{
return arr;
}
這是一些嚴重的_twisted_語法。你甚至可以在這裏獲得很多榮譽。我現在可以自由地使用typedefs,我知道_你可能已經拼寫到編譯器沒有_... +1 – sehe 2011-09-14 22:03:41
假設我想爲一個固定大小的數組編寫一個getter,並希望該方法以及引用的數組是const - 我將如何做到這一點在語法上?像這樣: int const(&GetArray()const)[3] {return mArray; }? – Bjoern 2015-03-13 09:06:43
@Bjoern:'typedef int A [3]; const A m; const A&f()const {return m; ''? – 2015-03-16 13:17:12
使用std :: vector就像這樣。
std::vector<int> function(const std::vector<int>& arr)
{
return arr;
}
像
int arr[] = {...};
數組是沒有用的,從一個功能,因爲它不能將其自身複製返回。
如果沒有必要,請勿使用它。你可以只傳遞一個數組的引用,如:
void foo(std::vector<int> &v) {
for (int i = 0; i < 10; ++ i) {
v.push_back(i);
}
}
如果你使用:
std::vector<int> foo() {
std::vector<int> v;
for (int i = 0; i < 10; ++ i)
v.push_back(i);
return v;
}
就會有容器的複製過程中,成本是昂貴的。
FYI:NRVO可能消除成本
我認爲你最好的選擇是將它作爲指針返回給數組。這裏是一個例子:
{
...
int newLength = 0;
int* arr2 = ChangeArray(arr, length, newLength);
...
delete[] arr2;
}
int* ChangeArray(int arr[], int length, int& newLength)
{
// reversing the number - just an example
int* newArr = new int[length];
for(int i = 0; i < length; i++)
{
newArr[i] = arr[length-i-1];
newLength++;
}
return newArr;
}
以下的作品,似乎並不混亂或誤解了!
int* returnarray(int a[])
{
for (unsigned int i = 0; i < 3; i++)
{
a[i] *= 2;
}
return a;
}
int main(int argc, char* argv[])
{
int arr[3] = {1,2,3};
int* p = returnarray(arr);
for (unsigned int i = 0; i < 3; i++)
{
cout << "p[" << i << "] = " << p[i] << endl;
}
cin.get();
return 0;
}
爲什麼你(或者任何開發人員)寫這個瘋狂的代碼? :\ – kennytm 2010-02-20 14:22:05
@ manugupt1:它的意圖是將數組作爲副本傳遞給函數嗎? – 2010-02-20 17:29:42