2014-01-13 44 views
3

在Java中有一個名爲ArrayList的集合。它允許程序員添加類型T的對象,並通過發出一個簡單的方法除去它們,像C++列出使用情況

list.remove(object); 
list.add(object); 

對於C++我發現,標準矢量僅使用值對象,因此我不看的方式來實現相同的功能。 這種情況是,我想持有對其他地方的對象的引用,爲什麼能夠使用某種組合模式刪除或添加它。什麼我要求的是如何實現這樣的事情在C++:

class Composite { 

    ArrayList<Composite> children = new ArrayList<>(); 

    public void addChild(Composite child) { 
    children.add(child); 
    } 


    public void removeChild(Composite child) { 
    children.remove(child) 
    } 
} 


class Test{ 
    public static void main() { 
    Composite a = new Composite(); 
    Composite b = new Composite(); 
    a.addChild(b); 
    a.removeChild(b); 

    // from here on a.children is empty.   
    } 

} 

我不知道怎麼咬這個東西在C++中。謝謝。

UPDATE:多虧了ResidenBiscuit答案,別人的意見我能弄清楚這個基本的代碼,這是可以在這個引擎收錄網址:http://pastebin.com/h17hh3r4

+2

尋找STL容器,特別是'std :: list'。 –

+1

'std :: vector >'就是你想要的,你可以使用'std :: remove'來移除元素。 – yngccc

回答

5

在Java中,除了POD一切都是參考。沒有說明你想要參考,因爲這就是你所得到的。

在C++中並非如此。一切都默認爲價值。如果你想要引用類型的std::list,那麼你需要一個支持C++ 11 std :: reference_wrapper的編譯器。然後,你可以這樣做:

std::list<std::reference_wrapper<Type>> t_list

要添加到這個列表中,您將需要使用std ::參考:

t_list.push_back(std::ref(myObj))

現在你加入到這個名單一切都將只是一個std :: reference_wrapper類型。您也可以通過,而不是隻是在做存儲指針:

std::list<Type*> tptr_list

這可能會更容易,或者是唯一的選擇,如果你沒有一個C++ 11兼容的編譯器。

+3

您不能創建引用向量。你的答案仍然對指針有效,否則你必須使用std :: reference_wrapper。 –

+0

啊,你是對的,忘記了這個警告。我會編輯。 – jready

+1

'std :: vector'不支持按照OP的要求隨機移除項目(不帶迭代器)。恕我直言,'std :: list'是這裏正確的java等價物。 –