2014-01-13 2 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 и другие замечания, которые я смог выяснить, основной код для этого, который доступен на этом Pastebin URL: 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

Чтобы добавить в этот список, вам нужно будет использовать зЬй :: исх:

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. IMHO 'std :: list' - это правильный эквивалент java. –

Смежные вопросы