Здравствуйте, 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);
...