Ну не знаю, часто бывает, что использование вектора для частых добавлений это просто ошибка проектирования, мне приходилось работать со списками данных с 2 и более миллионами записей, использовал list, проблем не обнаруживал вообще. Нормально и добавлял и бегал и получал доступ к нужным элементам, делал частичный индекс и многое другое и прожил без vector.
Если бы вы сначала описали, зачем вам понадобился именно vector. Было бы интереснее, да и может быть предложили бы другой вариант. А стандартный контейнер я переписывал только 1 раз, мне нужна была репликация данных на диск при изменении.
Ну хэши будут во время компиляции в одном случае, если этого захочет оптимизатор, а если не захочет, будет run-time код. Для того, чтобы был 100% compile-time нужно избавится от всех методов. А в вашем случае, если получится run-time, то будет совсем жуткое кол-во кода.
Простите, а где здесь compile-time? Я так понимаю compilte-time тут будет только если этого захочет оптимизатор, а иначе будет run-time? Или я ошибаюсь?
На худой конец можно было хотябы избавится от run-time, а синтаксис оставить подобным, что-то типа.
Что-то типа для одного байта, расширять можно до бесконечности
#include <iostream>
// Основной тип для вычисления, здесь пробегаем рекурсивно число.
template<
int c01 = -1, int c02 = -1, int c03 = -1, int c04 = -1,
int c05 = -1, int c06 = -1, int c07 = -1, int c08 = -1
>
struct bin_to_dec
{
enum {value = bin_to_dec<-1, c01, c02, c03, c04, c05, c06, c07>::value << 1 | c08};
};
// Тип для ротации вправо, в случае, если указаны не все биты.
template<
int c01, int c02, int c03, int c04, int c05, int c06, int c07
>
struct bin_to_dec<c01, c02, c03, c04, c05, c06, c07, -1>
{
enum {value = bin_to_dec<-1, c01, c02, c03, c04, c05, c06, c07>::value};
};
// тип для завершения вычислений, для завершения рекурсии первого типа
template<>
struct bin_to_dec<-1, -1, -1, -1, -1, -1, -1, -1>
{
enum {value = 0};
};
Ну здесь требуется понимание работы шаблонов, а это думаю не сложно, простейший рекурсивный шаблон. Если же пользоваться шаблонами и не знать как они работают, это не есть хорошо. Да и существуют комментарии, к хитрому коду пишу всегда, если наоборот не требуется запутать.
Ну да, минус только в разрядах, но для большинства задач хватает небольшого кол-ва, можно использовать 64 битный тип, будет побольше разрядов. Но в данном примере полный compile-time, а для run-time можно просто строку использовать.
hash_text очень странный, какой в нем смысл? Если функция runtime. Почему нельзя было использовать тернарный оператор и enum или static const unsigned int переменную, например как сделано в code_text для count. Тогда будет compile-time. А для двоичных чисел просто изврат какой-то. Вот реальный рабочий пример, без извратов и с минимумом кода.
template
struct binary
{
static const int value = (N % 10) + 2 * binary< N / 10 >::value;
};
template
struct binary
{
static const int value = 0;
};
использование
binary::value;
и в результате полнейший compile-time.
На будущее я бы посоветовал покопать в сторону мета-программирования на сях.
Почитать
Джеф Элджер C++ for Real Programmers (есть на русском)
Андреq Александреску Modern C++ Design (есть на русском)
David Abrahams and Aleksey Gurtovoy, C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond (на русском не видел).
А уже затем заниматься ненормальным программированием.
Совсем неочевидно, можно сказать одно с уверенностью, это 3 фарианта: -1, 0, +1.
1. Линия разреза прошла через 2 соседник вершины (угла) — получаем на 1 угол меньше
2. Линия разреза прошла через 1 соседнюю вершину и 1 соседнюю сторону — получаем идентичное кол-во углов
3. Линия разреза прошла через 2 соседних стороны — получаем на 1 угол больше
По 4й даже и этого сказать нельзя, а может тут некий аналог римской записи, только от положение результат не меняется, порядок можно менять и тогда 2й вариант равны, или же направление чтения справа налево и в 3м круглешочек с точкой внутри является нулем. Тут вообще ничего нельзя сказать и никак не сравнить, не зная закона.
4я задачка ваще какая то жесть. А вот если в самом первом примере первый знак является знаком минус. Или запись в этих числах с конца или запись по правилам римских чисел, как там сравнивать.
А вот по 5й я все же придерживаюсь мнения автора статьи, там написано «прибавила», а не «дописала».
Вообще страшно становится после того, как видишь школьные учебники, такого все больше и больше, я так понимаю это все переводы и переводы довольно фиговенькие. Особенно вспоминается задачка:
У стола отрезали угол, сколько углов стало у стола, из учебника первого класса.
Ну это слегка другое семейство фракталов и считаются иначе, это все же семейство Жюлиа и Мандельброта. Если в афинном множестве просчитывается координата точки, то в семействе Жюлиа просчитывается скорость улетания точки в бесконечность. Соотвественно афинные множества выглядят как хитрые фигуры и с резкими переходами, то семейство Жюлиа довольно плавные.
Есть еще стохастические фракталы, они очень хорошо подходят для генерации различных несемитричных фигур.
Если бы вы сначала описали, зачем вам понадобился именно vector. Было бы интереснее, да и может быть предложили бы другой вариант. А стандартный контейнер я переписывал только 1 раз, мне нужна была репликация данных на диск при изменении.
Что-то типа для одного байта, расширять можно до бесконечности
#include <iostream>
// Основной тип для вычисления, здесь пробегаем рекурсивно число.
template<
int c01 = -1, int c02 = -1, int c03 = -1, int c04 = -1,
int c05 = -1, int c06 = -1, int c07 = -1, int c08 = -1
>
struct bin_to_dec
{
enum {value = bin_to_dec<-1, c01, c02, c03, c04, c05, c06, c07>::value << 1 | c08};
};
// Тип для ротации вправо, в случае, если указаны не все биты.
template<
int c01, int c02, int c03, int c04, int c05, int c06, int c07
>
struct bin_to_dec<c01, c02, c03, c04, c05, c06, c07, -1>
{
enum {value = bin_to_dec<-1, c01, c02, c03, c04, c05, c06, c07>::value};
};
// тип для завершения вычислений, для завершения рекурсии первого типа
template<>
struct bin_to_dec<-1, -1, -1, -1, -1, -1, -1, -1>
{
enum {value = 0};
};
int main(int argc, char *argv[])
{
std::cout << bin_to_dec<1,0,1>::value << std::endl;
std::cout << bin_to_dec<0,1,1,0,0,1,0,1>::value << std::endl;
return 0;
}
В результате мы получили compile-time, нужно только подумать.
template<int N>
struct binary
{
static const int value = (N % 10) + 2 * binary<N / 10>::value;
};
template<>
struct binary<0>
{
static const int value = 0;
};
использовать
binary<11101111>::value
template
struct binary
{
static const int value = (N % 10) + 2 * binary< N / 10 >::value;
};
template
struct binary
{
static const int value = 0;
};
использование
binary::value;
и в результате полнейший compile-time.
На будущее я бы посоветовал покопать в сторону мета-программирования на сях.
Почитать
Джеф Элджер C++ for Real Programmers (есть на русском)
Андреq Александреску Modern C++ Design (есть на русском)
David Abrahams and Aleksey Gurtovoy, C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond (на русском не видел).
А уже затем заниматься ненормальным программированием.
1. Линия разреза прошла через 2 соседник вершины (угла) — получаем на 1 угол меньше
2. Линия разреза прошла через 1 соседнюю вершину и 1 соседнюю сторону — получаем идентичное кол-во углов
3. Линия разреза прошла через 2 соседних стороны — получаем на 1 угол больше
А вот по 5й я все же придерживаюсь мнения автора статьи, там написано «прибавила», а не «дописала».
Вообще страшно становится после того, как видишь школьные учебники, такого все больше и больше, я так понимаю это все переводы и переводы довольно фиговенькие. Особенно вспоминается задачка:
У стола отрезали угол, сколько углов стало у стола, из учебника первого класса.
struct Fractal
{
enum{Value=n * Fractal<n-1>::Value}
};
template<>
struct Fractal
{
enum{Value=1}
};
Fractal<5>::Value;
А так некий С++'шник.
Есть еще стохастические фракталы, они очень хорошо подходят для генерации различных несемитричных фигур.