C ++ эквивалент Java Linked List / C # Array List? - PullRequest
3 голосов
/ 12 июля 2011

Существует ли контейнер STL или что-то еще, что дает ту же функциональность, что и Java Linked List или C # Array List? т.е. добавление различных типов в один массив, например

List.Append(1);
List.Append("I am a string");
List.Append(True);

и динамические функции, такие как

List.Resize();
List.GetSize();

и др.?

Если нет, можете ли вы реализовать его самостоятельно с помощью шаблонов и т. Д.? Если да, то как?

Ответы [ 5 ]

7 голосов
/ 12 июля 2011

Это сложно реализовать с помощью шаблонов, потому что шаблоны предполагают один тип для членов. В C ++ вам придется использовать полиморфизм с общим источником (который доступен в Java и C # как общий родительский объект для всех классов, IMHO).

Вы можете попытаться сделать это с помощью библиотеки повышения, и boost::variant или boost::any ( выберите, какой из них соответствует вашим потребностям ).

4 голосов
/ 12 июля 2011

Во-первых, ArrayList в C # и LinkedList в Java - это принципиально разные звери (один реализует массив с изменяемым размером, а другой реализует связанный список).

Во-вторых, ArrayList в C # (но не в Java) устарела;используйте вместо этого универсальный List<T> (в вашем случае List<object>).

В-третьих, это соответствует std::vector в C ++.

Если вам нужночтобы вставить в него различные типы, у вас есть три основных варианта:

  • Использовать Boost.Any
  • Использовать Boost.Variant
  • Используйте общий базовый класс.Это наиболее разумная альтернатива в 95% случаев.
1 голос
/ 12 июля 2011

Вы можете использовать boost :: any и затем std :: list.
Взгляните на примеры на главной странице Boost.

0 голосов
/ 12 июля 2011

Java / C # управляет этим, имея класс Object, от которого происходят все классы.C ++ не имеет этого корня.

Если все ваши данные находятся в иерархии классов, вы можете использовать std :: list или вектор указателей (голых или умных) на корневой класс.

Если нет, то вам нужно использовать адаптер, чтобы они выглядели одинаково, например, boost :: variable , а затем составить список из них.например, std::list<boost::variant>

0 голосов
/ 12 июля 2011

Вы можете комбинировать std :: list с boost.Variant типа T.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...