C++ STL-почему у forward list нет метода size ()?
Я использую c++11 в forward_list
как контейнер для быстрых вставок, без больших накладных расходов памяти, так как это односвязный список.
осознав, что forward_list
нет size()
метод, я немного смущен рассуждениями об этом. Не может ли он просто поддерживать частное поле, отслеживающее вставленные и удаленные узлы, следовательно, реализуя операцию O (1) size ()?
3 ответов
N2543 это предложение, и у него есть подробное обсуждение о size()
.
выбор между вариантом 3 [Не предоставление
size()
] и Вариант 2 [Предоставление O (1)size()
] Это скорее вопрос суждения. Я выбрал вариант 3 по той же причине, по которой я выбрал insert-after вместо insert-before: Вариант 3 более соответствует цели нулевые накладные расходы по сравнению с рукописного в стиле C ++ связанный список. Ведение счета удваивает размер а
контейнеры STL традиционно / разумно удалили особенности структур данных, которые не работают хорошо с точки зрения времени и пространства.
добавление цитаты из "стандартной библиотеки C++ - учебник и справочник"
A
std::forward_list
не даетsize()
функции-члена. Это следствие упущения функции, создающие времени или пространстве накладные расходы по отношению к собственноручной однонаправленного списка.
интересно, рассматривал ли стандартный комитет mix - in в качестве параметров шаблона, которые могут добавить обслуживание необязательного члена размера в классы списка? Это позволило бы классу иметь необязательное количество элементов без потери общности.
такой
class HasSize
{
public:
HasSize() : size_(0) { }
void addSize(size_t add) { size_ += add; }
bool has_size() { return true; }
size_t size() { return size_; }
size_t size_;
};
class NoSize
{
public:
void addSize(size_t add) { }
bool has_size() { return false; }
size_t size() { return 0; }
};
template<type T, type Allocator, type Sz = HasSize>
class forward_list
{
void push_back( T &arg )
{
...
opt_.addSize( 1 );
}
size_t size()
{
if (opt_.has_size())
return opt_.size();
else
return std::distance(begin(), end());
}
Sz opt_;
};
/ этот вопрос был отмечен как дублированный, поэтому добавьте его сюда/