Re[8]: Быстрый поиск байта в фрагменитованном файле
От: _smit_work  
Дата: 24.12.15 15:13
Оценка:
Здравствуйте, watchmaker, Вы писали:

W>Здравствуйте, _smit, Вы писали:


_>>"равно" появилось именно после тестов.


W>Ну ок. Да, <= в lower_bound можно оставить. Просто нужно обязательно помнить, что этот предикат задаёт лишь разбиение, но не strict weak ordering. То есть, если его подставить в очень похожие алгоритмы вроде std::equal_range, или std::binary_search, или как параметр std::map/set, то это приведёт к UB. Из-за таких потенциальных, но довольно вероятных проблем я бы поостерёгся так писать.


Согласен!

_>>то же самое будет, если фрагмент имеет длину n, на запрос at(n) вернется не следующий, а текущий номер фрагмента.

W>Что?
W>Например, если у тебя файл состоит из трёх фрагментов длиной соответственно n, m и k. То в массиве m_index_list будет три элемента: {0, n, m + n}. Разумеется, lower_bound от n вернёт итератор на средний элемент массива, то есть как раз на фрагмент длиной m, который и содержит в себе все байты с индексами от n до n + m — 1 включительно. Всё как надо.

Я вот о чем: http://ideone.com/onlLWh

#include <iostream>
#include <algorithm>
#include <vector>
//#include <cstddef>

int main() 
{
    std::vector<size_t> m_index_list;
    m_index_list.push_back(0);
    m_index_list.push_back(5);
    m_index_list.push_back(9);

    for (size_t data_pos = 4; data_pos < 12; ++data_pos)
    {
        // your code goes here
        auto it = lower_bound(m_index_list.begin(), m_index_list.end(), data_pos);

        //тут проверка, что fragment_index существует (т.е. it != end(m_index_list)) 

        size_t fragment_index = it - m_index_list.begin();

        std::cout << "data_pos " << data_pos << ": fragment_index = " << fragment_index << std::endl;
    }
 
    return 0;
}


data_pos 4: fragment_index = 1
data_pos 5: fragment_index = 1 <--- ошибка
data_pos 6: fragment_index = 2
data_pos 7: fragment_index = 2
data_pos 8: fragment_index = 2
data_pos 9: fragment_index = 2 <--- ошибка
data_pos 10: fragment_index = 3
data_pos 11: fragment_index = 3

получается, чтобы избежать ошибки надо добавлять на 1 меньше, что тоже решение:

...
    m_index_list.push_back(0);
    m_index_list.push_back(5 - 1);
    m_index_list.push_back(9 - 1);
...
Отредактировано 24.12.2015 15:18 _smit_work . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.