Минимальный набор вложенных typedef для пользовательской последовательности STL? - PullRequest
3 голосов
/ 28 января 2011

Каков минимальный набор вложенных typedef, которые должны быть определены в пользовательском классе STL, соответствующем концепции Sequence?Пользовательская последовательность должна быть совместима с:

  1. std :: back_insert_iterator
  2. BOOST_FOREACH
  3. Повышениедиапазон концепт.

Ответы [ 2 ]

5 голосов
/ 28 января 2011

Стандарт C ++ говорит, что все контейнеры должны иметь следующие typedefs (C ++ 03 23.1 / Таблица 65):

value_type
reference
const_reference
iterator
const_iterator
difference_type
size_type

Обратимые контейнеры должны иметь следующие typedefs (C ++ 03 23.1 / Таблица 66):

reverse_iterator
const_reverse_iterator
0 голосов
/ 28 января 2011

Я придумал эту программу, чтобы найти минимальный набор вложенных typedefs:

#include <iostream>
#include <iterator>
#include <vector>
#include <boost/foreach.hpp>
#include <boost/range/algorithm/sort.hpp>

struct Foo
{
    typedef std::vector<int> Vec;
    typedef Vec::const_reference const_reference;
    typedef Vec::iterator iterator;
    typedef Vec::const_iterator const_iterator;

    iterator begin() {return vec.begin();}
    iterator end() {return vec.end();}
    const_iterator begin() const {return vec.begin();}
    const_iterator end() const {return vec.end();}
    void push_back(const int& n) {vec.push_back(n);}

    Vec vec;
};

int main()
{
    Foo f;
    std::back_insert_iterator<Foo> it(f);
    *it = 2; ++it; *it = 1; ++it;
    boost::sort(f);
    BOOST_FOREACH(int x, f)
    {
        std::cout << x << " ";
    }
}

Как видите, по крайней мере const_reference, iterator и const_iterator необходимы.

Я должен упомянуть, что я скомпилировал это с gcc 4.4.3 и boost 1.43.

...