2013-07-08 5 views
1

Не могли бы вы рассказать мне, что является ближайшим типом данных в C++ для списка python? Если нет ничего похожего, как бы вы построили его на C++?эквивалент Python в C++?

+3

http://www.cplusplus.com/reference/list/list/. Обратите внимание, что списки C++ реализованы как дважды связанный список, в то время как списки python - это [массивы переменной длины] (http://docs.python.org/2/faq/design.html#how-are-lists-implemented). –

+0

Какую функцию вы ищете? – Mario

+0

@AshwiniChaudhary: списки Python могут хранить элементы, имеющие разные типы. http://docs.python.org/release/1.5.1p1/tut/lists.html – Korchkidu

ответ

7

std::vector s, s std::list и arrays (или std::array s) все имеют функции, аналогичные списки Python. Какую структуру данных вы хотите выбрать, зависит от ваших требований.

+0

Списки Python могут хранить элементы разных типов. http://docs.python.org/release/1.5.1p1/tut/lists.html – Korchkidu

+2

@Korchkidu Правда, но это было не то, о чем специально спросил ассер. И делать это на C++, особенно в качестве новичка, задает проблемы. Если ген не изменит вопрос о том, что они специально запрашивают что-то, что может хранить любой тип, то я собираюсь интерпретировать этот вопрос как запрос одномерной структуры данных с произвольным доступом. –

+1

@ EricFinn Он специально не просил ничего. Предположительно, он знает о 'std :: vector' (кто этого не делает), и это недостаточно близко. Почему это не достаточно близко, это еще один вопрос/ –

3

Возможно хранение boost :: any в std :: vector? http://www.boost.org/doc/libs/1_54_0/doc/html/boost/any.html

Вот простой рабочий пример. См. Также комментарии Джеймса ниже.

#include "../boost_1_54_0/boost/any.hpp" 
#include <vector> 
#include <string> 
#include <iostream> 

int main() 
{ 
    std::vector<boost::any> myList; 

    myList.push_back(std::string("Hello")); 
    myList.push_back(10); 
    myList.push_back(std::string("World")); 

    std::string any1 = boost::any_cast<std::string> (myList[0]); 
    int any2 = boost::any_cast<int> (myList[1]); 
    std::string any3 = boost::any_cast<std::string> (myList[2]); 

    std::cout<<any1<<" "<<any2<<" "<<any3<<std::endl; 

    return 0; 
} 
+1

Собственно, хранение 'std :: shared_ptr ', а затем создание (шаблона?) Классов-оболочек, происходящих из 'Object', приближается. Элементы списка Python имеют ссылочную семантику; Семантика значения 'boost :: any'. –

+0

@JamesKanze: Да. в самом деле. Спасибо за информацию. Не уверен, как далеко он хочет идти в направлении Python, хотя;) – Korchkidu

2

Фактически никакой контейнер C++ не эквивалентен списку Python, что частично является результатом очень разных объектных моделей C++ и Python. В частности, предложенный и поддержанный std :: list - это IMHO, даже не близкий к типу списка Python, я бы предпочел предложить std :: vector или, может быть, std :: deque. Тем не менее, неясно, что именно вы хотите и как «построить» сильно зависит от того, что именно «это», то есть от того, что вы ожидаете от контейнера.

Я предлагаю вам ознакомиться с контейнерами C++ std :: vector, std :: deque и std :: list, чтобы получить обзор. Затем посмотрите на такие вещи, как Boost.Any и Boost.Variant, которые вы можете комбинировать с ними, возможно, также один из умных указателей и Boost.Optional. Наконец, проверьте Boost.Container и Boost.Intrusive. Если маловероятный случай, когда ни одно из них не дает подходящего приближения, вам необходимо лучше объяснить, каковы ваши фактические цели.

+0

Не забывайте, что вы можете написать что-то вроде 'l2 = l1 [3: 20: 2]', чтобы получить каждый другой элемент в диапазоне '[3 ... 20]'. И этот индекс отрицательных индексов с дальнего конца. –

+0

Нарезки Python очень мощные, вы даже можете использовать их для вставки или удаления элементов. Однако размышление о том, что контейнер может или не может сделать, бесполезно, OP нуждается в разъяснении, что именно им нужно. –

2

Реального эквивалента нет, и было бы чрезвычайно сложно получить . Python и C++ радикально отличаются от языков, и предоставление одного действительно не имеет смысла в контексте C++. Наиболее важными отличиями являются то, что все в Python динамически распределено и является «объектом» , и что Python использует утиную печать.

FWIW: один очень рано библиотека (до шаблонов) в C++ сделал предложение контейнеров из Object*, с производными классами боксировать int, double и т.д. Фактический опыт показал очень быстро, что не было хорошей идеей. (И мне любопытно: кто-нибудь еще его помню? И конкретно, именно то, что было , называется --- что-то с NHS в нем, но я не могу вспомнить больше.)

1

Я работаю над wrapper для std :: vector, что делает его более похожим на списки Python с именем pylistpp. API такой же, как Python. Пример:

#include <list.hpp> 
#include <iostream> 

int main() 
{ 
    list<int> mylist; 
    mylist.append(5); 
    mylist.append(7); 
    int count = mylist.count(5); 
    std::cout << count << std::endl; 
    std::cout << mylist.pop(0) << std::endl; 
    std::cout << mylist.index(7); 
    return 0; 
} 
Смежные вопросы