Когда использовать указатели и если не к?

Вот потенциальная оптимизация для больших кадров данных. Это выполняется быстрее, когда в поле «взрыва» есть несколько равных значений. (Чем больше размер кадра данных сравнивается с уникальным значением в поле, тем лучше будет работать этот код.)

def lateral_explode(dataframe, fieldname): 
    temp_fieldname = fieldname + '_made_tuple_' 
    dataframe[temp_fieldname] = dataframe[fieldname].apply(tuple)       
    list_of_dataframes = []
    for values in dataframe[temp_fieldname].unique().tolist(): 
        list_of_dataframes.append(pd.DataFrame({
            temp_fieldname: [values] * len(values), 
            fieldname: list(values), 
        }))
    dataframe = dataframe[list(set(dataframe.columns) - set([fieldname]))]\ 
        .merge(pd.concat(list_of_dataframes), how='left', on=temp_fieldname) 
    del dataframe[temp_fieldname]

    return dataframe
27
задан 29 December 2008 в 07:04
поделиться

5 ответов

Запустите путем предотвращения указателей.

Используют их когда:

  • Вы хотите использовать идиома Pimpl , или абстрактная фабрика .
  • Bar экземпляром на самом деле управляет некоторая другая часть Вашей программы, тогда как Foo класс просто должен быть в состоянии получить доступ к нему.
  • Вы хотите отложить конструкцию Bar объект (т.е. Вы хотите создать его после построение Foo).
  • В Вашей бизнес-логике, эти Bar объект не может существовать вообще; Вы использовали бы null также в Java. Однако выезд повышение:: дополнительный также.
  • Bar на самом деле базовый класс, и Вам нужен экземпляр, чтобы быть полиморфными.
  • Вы, оказывается, используете инструментарий, который предпочитает представлять виджеты GUI как указатели. Примеры могли включать (но конечно не ограничены) wxWidgets и GLUI.

В любом из этих случаев (*), запустите при помощи интеллектуального указателя, такой как [1 112] повышение:: shared_ptr. Иначе Вы, вероятно, забудете освобождать память рано или поздно. Как только Вы знаете то, что Вы делаете, считаете индивидуальными, какой тип указателя является лучшим.

(*) любой случай †“кроме, вероятно, маркер относительно виджетов GUI; в этом случае Ваш инструментарий по всей вероятности управлял бы ресурсами для Вас также

39
ответ дан 8 revs 14 October 2019 в 13:16
поделиться
class Foo {
    Bar b;
}

b , содержал в Foo. Если объект Foo заканчивает время жизни, b автоматически заканчивает время жизни также. Это что состав моделей. b выше обозначает сам объект, не только указатель на него как в Java. Для этого, если b выйдет из объема, объект закончит время жизни.

class Foo {
    Bar * b;
}

Здесь, объект b указывает на, используются или ссылаемый объект Foo. Если объект Foo заканчивает время жизни, объект b указывает на, может продолжить жить, в зависимости от обстоятельств. Это может привыкнуть к образцовому агрегированию и общим отношениям. Объект может быть совместно использован с другими объектами Foo, например.

Указатели примерно, какие ссылки находятся в Java. Они ни на что не могут также указать. Если указатель ни на что не указывает, это - нулевой указатель.

Подобный указателям ссылки. Ссылки в C++ должны быть инициализированы и могут только указать на один (допустимый) объект, для которого была инициализирована ссылка. Ссылка для этого не может содержать значение, которое не могло означать "ничего" как null в Java.

19
ответ дан Johannes Schaub - litb 14 October 2019 в 13:16
поделиться

Необходимо сделать некоторое программирование блока и понять расположение памяти хорошо. C является просто межплатформенным блоком, в отличие от Java или других языков. Для использования его правильно нужно понять низкоуровневые детали.

Все сделанные комментарии действительны, но для людей как Вы, кто спрыгивает с высокоуровневых языков к C, имение этого вида опыта было бы более, чем выгодно. С надлежащим пониманием Вы не задавали бы вопросы как этот больше.

1
ответ дан valenok 14 October 2019 в 13:16
поделиться

В первой памяти в качестве примера для Панели объект будет выделен автоматически при построении объекта Foo. Во втором случае необходимо выделить память сами. Таким образом, необходимо звонить:

Foo *foo = new Foo();
foo->b = new Bar();

Это может быть желательно, если объект Панели является большим, и Вы не хотите связывать его объектом Foo. Также желательно, когда конструкция объекта Панели независима от создания объекта Foo. В этом случае объект b "введен" в нечто:

Foo *foo = new Foo();
foo->b = b_ptr;

, где b_ptr создается где-то в другом месте и указатель передается нечто.

Для меньших объектов это опасно, поскольку можно забыть выделять память.

3
ответ дан kgiannakakis 14 October 2019 в 13:16
поделиться

Оба хорошо происходят в различных условиях. Например, если Вы знаете, как создать b, когда объект класса, Foo создается, первое, в порядке. Но если Вы не делаете, единственный выбор состоит в том, чтобы использовать второе.

1
ответ дан PolyThinker 14 October 2019 в 13:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: