Перезаписывание Dict при добавлении

Способ иметь отдельную реализацию выглядит следующим образом.

//inner_foo.h

template <typename T>
struct Foo
{
    void doSomething(T param);
};


//foo.tpp
#include "inner_foo.h"
template <typename T>
void Foo<T>::doSomething(T param)
{
    //implementation
}


//foo.h
#include <foo.tpp>

//main.cpp
#include <foo.h>

inner_foo имеет форвардные объявления. foo.tpp имеет реализацию и включает inner_foo.h; и foo.h будет иметь только одну строку, чтобы включить foo.tpp.

Во время компиляции содержимое foo.h копируется в foo.tpp, а затем весь файл копируется в foo.h после который он компилирует. Таким образом, ограничений нет, и именование согласовано в обмен на один дополнительный файл.

Я делаю это, потому что статические анализаторы для кода разбиваются, когда он не видит передовые объявления класса в * .tpp. Это раздражает при написании кода в любой среде IDE или с помощью YouCompleteMe или других.

0
задан Ryan 13 July 2018 в 17:49
поделиться

2 ответа

Вы переписываете список с каждой итерацией. Вместо этого вы можете проверить, существует ли ключ в dict, если не создать новый ключевой список

Ex:

image_dict={}
for index, item in enumerate(data.ImageID):
    if item not in image_dict:
        image_dict[item] = []
    image_dict[item].append((data.XMax[index], data.XMin[index], data.YMax[index], data.YMin[index]))
2
ответ дан Rakesh 17 August 2018 в 12:19
поделиться

Проверьте collections.defaultdict :

from collections import defaultdict

image_dict = defaultdict(list)
for index, item in enumerate(data.ImageID):
    image_dict[item].append((data.XMax[index], data.XMin[index], data.YMax[index], data.YMin[index]))

Он создает пустой список, если он не существует и не добавляется к нему. См. Пример в документах.

1
ответ дан Ben 17 August 2018 в 12:19
поделиться
Другие вопросы по тегам:

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