Да, такое неявное использование может быть много где. Хотя опытный разработчик класса Data предусмотрит дополнительное резервирование отдельным методом, а вызывающий зарезервирует хотя бы под размер файла (тут конечно хорошо если его можно получить, хехе).
P.S. Я ж надеюсь правильно помню, что холостой reserve() достаточно дешевый и не вызывает реаллокейтов?
Правильно, я пролистал доку. Но, если я правильно понял, он имеет право резервировать и больше, чем ему сказали, так что в другой реализации вектора проблем может и не оказаться. Интереснее, что push_back гарантирует константное амортизированное время - я привык на такое не закладываться и сам удваивать размер массива при необходимости.
Грустный код. Вижу такое второй раз - вроде бы zeux такую же подставу показывал в роблокоде. Мой вывод - не надо говорить людям, что есть reserve, они от этого плохо спят, пишут всякое стыдное, пухнут и не дохнут.
Comments 19
причем довольно давно, несколько лет назад
Reply
Reply
class Data {
std::vector data;
void AddMoreData(char *p, size_t n) {
data.reserve(data.size() + n);
for (size_t i = 0; i < n; ++i) {
if (p[i] != 'x') {
data.push_back(p[i]);
}
}
}
};
..............
Data data;
for (каждая строка LINE из файла) {
data.AddMoreData(LINE.c_str(), LINE.size());
}
Reply
P.S. Я ж надеюсь правильно помню, что холостой reserve() достаточно дешевый и не вызывает реаллокейтов?
Reply
Но, если я правильно понял, он имеет право резервировать и больше, чем ему сказали, так что в другой реализации вектора проблем может и не оказаться.
Интереснее, что push_back гарантирует константное амортизированное время - я привык на такое не закладываться и сам удваивать размер массива при необходимости.
Reply
Reply
Reply
Reply
Reply
Reply
Мой вывод - не надо говорить людям, что есть reserve, они от этого плохо спят, пишут всякое стыдное, пухнут и не дохнут.
Reply
Leave a comment