2012-07-19 35 views
1

有沒有辦法將'std :: vector 2d'作爲指針傳遞給'2d c array'到一個功能。有沒有辦法將'std :: vector 2d'作爲指向'2d c array'的指針傳遞給函數

我知道你可以將std :: vector 1d作爲指向c數組的指針傳遞給某個函數。 例如, 功能:

void foo(char* str); //requires the size of str to be 100 chars 

std::vector<char> str_; 
str_.resize(100); 
foo(&str_[0]); //works 

我不知道是否是可能的2D矢量太像 功能

void foo(char** arr_2d); 

和矢量

std::vector<std::vector<char>> vector_2d; 

我嘗試以下代碼,但我得到一些與堆損壞相關的錯誤。

std::vector<std::vector<unsigned char>> vector_2d; 
//assuming function expects the size of the vector to be 10x10 
vector_2d.resize(10); 
for(int i=0;i<10;i++) 
{ 
    vector_2d[i].resize(10); 
} 
foo(&vector_2d[0]);//error here 
+0

好吧,現在終於* *所有這些修改後您的問題有一定的道理 – 2012-07-19 21:54:54

+0

順便說一句,'char **'與數組數組一起使用,而不是2-D數組 – 2012-07-19 22:00:08

+0

不能直接做,對不起。你必須從你的矢量建立一個指針數組。 – 2012-07-19 22:09:56

回答

3

這裏是你可以做什麼:

std::vector< std::vector<unsigned char> > vector_2d; 
vector_2d.resize(10); 
std::vector<unsigned char*> ptrs(vector_2d.size()); 
for(int i=0;i<10;i++) 
{ 
    vector_2d[i].resize(10); 
    ptrs[i] = &vector_2d[i][0]; 
} 
foo(&ptrs[0]); 
0

不,你不能這樣做。原因是char**是指向char的指針,但&vector_2d[0]的類型爲std::vector<char>*

我建議你改變功能的接口,把你的二維矢量(你可能要重新設計是一類單持有std::vector<char>並提供operator()(int x,int y)在緩衝區訪問元素(x,y)。另外,您也可以根據需要創建所需的數據結構:

std::vector<std::vector<char> > data2d; 
std::vector<char *> iface_adapter; 
iface_adapter.reserve(data2d.size()); 
for (unsigned int i = 0; i < data2d.size(); ++i) { 
    iface_adapter.push_back(&data2d[i][0]); 
} 
foo(&iface_adapter[0]); 
+0

但他得到函數調用之前的錯誤... – 2012-07-19 21:57:03

+0

@MattPhillips:這是一個錯誤的問題。我編輯了這個。 – 2012-07-19 21:58:05

+0

這不是一個錯誤..我得到錯誤之前的函數調用..正確的地方我錯誤在這裏評論@JesseGood – int80h 2012-07-20 03:13:04