скорость списка
{
double x;
double y;
};
struct st1
{
. . .
list<int> n;
list<point> p;
};
class MyFile
{
. . .
list <st1> records;
};
Получилось так, что при использовании указателей 3000 записей читались за секунду, а со списками на это уходит секунд 30, да еще и памяти мегабайт 60.
Вопрос 2:
Есть много double значений типа 709454.2682, причем первые несколько цифр одинаковы (в данном случае - 709). Как максимально быстро в массиве найти количество этих цифр и оставить только правую часть? Всем спасибо!
Используй индексы, как делают БД. При добавлении/изменении записей обновляй по ходу индекс, при поиске значений ищи их по индексу, это будет намного быстрее перебора.
В данном случае, например, можно иметь массив вида Index[prefix] = array of ID, где prefix - все возможные значения первых 3х цифр, которые ты собираешься искать. Каждая запись массива содержит ID (или какая у тебя адресация в БД) записи, у которой это поле начинается с prefix.
Доработай под свою задачу.
Почему list, а не vector? vector, в общем случае, можно так же быстро считать, как и динамически выделенный массив. Ну и код чтения не был приведён, чтобы что-то сказать наверняка.
Есть много double значений типа 709454.2682, причем первые несколько цифр одинаковы (в данном случае - 709). Как максимально быстро в массиве найти количество этих цифр и оставить только правую часть? Всем спасибо!
Тут в общем случае тоже сразу не видно как решать, да и не совсем ясно что значит "оставить только правую часть". Правую часть числа или массива?
Если допустим перевод в int, то можно поломать голову (или, например, домножить на коэффициент 10000 и перевести в какой-нибудь long long int). Иначе пока не вижу другого подхода, кроме как переводить в строку.
Так что в некоторых случаях - список рулит, в некоторых вектор, и говорить что список - отстой, а вектор рулит, в общем случае нельзя.
Что касается второго вопроса, то можно сделать так.
a. переводим числа в строковое представление.
b. принимаем длину первой строки за искомую длину левой части, обозначим её как L.
c. Пробегаем по всем элементам массива, каждый раз вычисляя длину совпадающего начала текущеё строки и первой строки до длины не превышающей L(обозначим как L1) и, если L1<L, то L=L1. Если L==0, то дальше можно не искать.
А кто это говорит? Тут не общий, а конкретный случай. Вектор является наиболее близким аналогом динамически выделяемого массива. Зарезервировал нужное количество ячеек и добавляй. Или выделил сколько нужно памяти и махом считал весь файл (правда, если тут string и прочие хитрые типы, то это не тот случай).
Если допустим перевод в int, то можно поломать голову (или, например, домножить на коэффициент 10000 и перевести в какой-нибудь long long int). Иначе пока не вижу другого подхода, кроме как переводить в строку.
Правая часть это именно то, что не повторяется в каждом значении. Про строку я и сам думал, но что-то мне подсказывает, что это не лучший вариант:)
Что касается кода, да, каюсь. Код на работе, а я -дома. Опишу вкратце:
list<Record> records; //Список записей
// Очистка списков rec
. . .
//Чтение заголовка записи постоянного размера при помощи ReadFile()
. . .
//Чтение данных о числе точек в записи
. . .
// Чтение данных в rec
. . .
//Добавление rec в список
records.insert(в_конец, rec);
Хорошая идея. Но может автору самому интересно его изобрести :)
Про индекс для поиска значений - если цифры всегда будут 6-ти ззначными (709454), то делишь её на 1000, иначе преобразуешь в строку и берёшь первые 3 символа. Потом полученное число используешь как индекс для массива. Элемент массива может либо содержать набор указателей на полные записи элементов, либо, если всегда нужно будет только знать количество элементов с такими 3-мя первыми цифрами - то просто ulong.
Легко реализовать и быстрый поиск. При изменении записей просто делай +/- 1 у соответствующего элемента индекса.
Такой варинат будет в любом случае быстрее, чем искать элементы в ходе работы проги.
Всё равно не ясно. А если у нас числа 709454.2682 и 7094.2682, то будем 7094 откидывать? А если 709454.2682 и 7094.5482, то 709454 будем?
Условие нечётко формулируешь. Сформулировал бы чётко, давно решил бы сам с помощью каких-нибудь frexp, ldexp, домножений на коэффициент и битовых масок... А так, в общем виде - преобразовывай в строку.
Думаю в коде что-то лишнее, ну и list на vector надо всё-таки заменить. Что мешает попробовать? Ну и векторовское reserve не помешает, наверное.
Что касается второго вопроса, то количество цифр в числах одинаково.
Вот.:D