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_;
};

/ этот вопрос был отмечен как дублированный, поэтому добавьте его сюда/