Я ищу что-то, что является std :: vector, но без больших накладных расходов и немного больше, чем std :: array, потому что с std :: array у меня не было размера, сохраненного в любом случае (это известно только из самого типа).
Чего я хочу добиться:
Написано с «динамическими» контейнерами это как:
std::map< int, std::vector< std::pair<int,int>>>;
Мне не нужно никаких изменений во время выполнения, но мне нужна информация о размере во время выполнения. Замена std :: vector на std :: array может не сработать, потому что массив должен быть одинакового размера для всех записей на карте, а это не то, что мне нужно.
Только я! хочу спросить, есть ли уже доступная реализация вокруг. Если ответ просто «Нет», нет необходимости предлагать, как выполнять работу. Я только хочу не изобретать велосипед снова 🙂
Предыстория: я могу использовать stl на своих маленьких контроллерах avr, но накладные расходы «немного» высоки. Поэтому я надеюсь найти стандартную реализацию, которая соответствует потребностям в представлении констант времени во время компиляции с реализованными функциями, такими как begin () / end () и итераторами, чтобы выполнить минимальные требования к контейнерам, чтобы их можно было использовать с Range на основе for и другими.
C ++ 14 также доступен, если есть что-то, что я ищу.
Я обнаружил, что реализован полный шаблон, в котором доступ к данным также является постоянной времени компиляции, например:
container.get<2>()
который я также не мог использовать, потому что мне нужны переменные времени выполнения для доступа к моим данным.
РЕДАКТИРОВАТЬ: какие проблемы / накладные расходы возникают при использовании std :: vector:
При использовании std :: vector мне нужно также new / delete, что приводит к наличию malloc / free для avr. Я также обнаружил, что на avr инициализация самого вектора занимает около 350 байтов кода для каждого экземпляра шаблона, который я использую. Функции доступа, такие как operator[]
а также итераторы очень малы.
Чтобы избежать накладные расходы из std::vector
, вы можете использовать вместо std::initializer_list
const std::map<int, std::initializer_list<std::pair<int, int>>>
Мне не совсем понятно, что вы ищете, но я думаю, что вы могли бы достичь того, что вам нужно, с помощью следующего:
std::vector(start, end)
где начало и конец вычисляются через блоки из N элементов.То, что вы спрашиваете, кажется невозможным в принципе. Вы говорите, что хотите избежать размещения в куче вашего вектора, подобного типу, но размер типа в стеке должен быть известен во время компиляции и одинаков для всех членов этого типа. Поскольку map является однородным контейнером, тип значения должен быть одного типа с постоянным размером. Вы можете заменить карту на кортеж, но тогда все ваши ключи должны быть известны во время компиляции.