2012-12-14 49 views
1

我有一個名爲陣列頂點,它的聲明如下:如何將數組添加到列表中?

CPoint vertices[11]; 

然後,我有一個名爲_m_ElementList_

std::list<CPoint[11]> m_ElementList; 

使用的addElement(名單)我要添加元素該列表中的每個元素都是CPoint對象(即與頂點相同類型的對象)

void AddElement(CPoint* vertices) 
    { m_ElementList.push_back(vertices); } 

出於某種原因無法運作的,它告訴我,沒有任何功能的情況下列表 - 爲什麼是這樣,我應該怎樣做參數匹配?

+1

由於當參數類型與列表項類型不匹配時出現問題,爲什麼不能使參數類型匹配列表項類型。 –

+0

@乾杯和hth這正是我的問題!我應該如何將數組傳遞給函數?我嘗試過'void AddElement(CPoint vertices [11])' - 但是,它不起作用。 – Ghost

+0

原始數組不可複製,所以它不如列表元素。但是你可以把它包裝在一個'struct'中。或者更好,使用一個'std :: array'來爲你做這件事,或者如果你需要可變長度的話,可以使用'std :: vector'(有些代價,但不是很多)。 –

回答

3

使用原始數組和指針的想法開始時是錯誤的。您已經在使用std::list(即您似乎瞭解標準容器),那爲什麼不使用std::vector<CPoint>呢?它將使您的生活更輕鬆:

std::list<std::vector<CPoint>> m_ElementList; 

然後:

void AddElement(std::vector<CPoint> const & vertices) //C++03 
{ 
    m_ElementList.push_back(vertices); //copy 
} 

由於:

void AddElement(std::vector<CPoint> vertices) //C++11 
{ 
    m_ElementList.push_back(std::move(vertices)); //move 
} 

如果你的編譯器不支持C++ 11,然後如參考傳遞一個旁註,我認爲AddVertices將是一個更好的名字。

0
std::list<CPoint[11]> m_ElementList; 

你宣佈你的列表類型錯了,<>括號定義列表持有什麼類型的,沒有多少元素,適當的聲明將是:

std::list<CPoint> m_ElementList; 
0

問題有括號後CPoint。模板的目的是提供類的類型(或者更重要的是類的大小),而不是數字。嘗試:

std::list<CPoint> m_ElementList; 
1

您可以將數組引用爲數組本身或作爲指向第一個元素的指針。例如:

CPoint vertices[11]; 

// address of the first element 
p_vertices = &vertices; 

// allocate 
CPoint * vertices = new CPoint[11]; 

// deallocate 
delete [] veritices; 

如果採取後一種方法,你可以簡單地聲明你的載體爲:

std::vector<CPoint*> m_elementList 

和插入爲:

void AddElement(CPoint* points) 
{ 
    m_elementList.push_back(points); 
} 

這也有一個輕微的優勢,如果喲您需要將點數改爲11以外的點,因爲動態分配允許使用變量來代替常量。但是,您需要謹慎地控制對矢量,它包含的數組和元素的訪問權限,以便執行正確的用法。

順便說一句,它完全沒混搭STL和C風格的指針,特別是如果你希望通過各地相當多的數據結構和內容的複製是不可取的或昂貴的。