В STL существует ли dereference_iterator?

Просто выбросьте это: если вам нужно сопоставить более чем одну строку, например abc и def, вы можете поместить комбинацию двух списков следующим образом:

matchers = ['abc','def']
matching = [s for s in my_list if any(xs in s for xs in matchers)]

Выход:

['abc-123', 'def-456', 'abc-456']
15
задан Luc Touraille 9 December 2008 в 08:47
поделиться

3 ответа

Попробуйте Повышение indirect_iterator .

indirect_iterator имеет ту же категорию как итератор, который она переносит. Например, indirect_iterator<int**> итератор произвольного доступа.

11
ответ дан 1 December 2019 в 03:52
поделиться

Если это - невозможное Повышение использования, пишущий, что пользовательский итератор не это трудно. Вот пример, "разыменовывают итератор", который отвечает требованиям InputIterator:

#include <iterator>

template <typename T>
struct PointedType;

template <typename T>
struct PointedType<T*>
{
  typedef T value_type;
};

template <typename InputIterator>
struct DerefIterator
{
  typedef input_iterator_tag iterator_category;
  typedef typename PointedType<
            typename iterator_traits<InputIterator>::value_type>::value_type
            value_type;
  typedef typename iterator_traits<InputIterator>::difference_type
            difference_type;
  typedef value_type* pointer;
  typedef value_type& reference;

  public:
    explicit DerefIterator(const InputIterator& ii)
      : it(ii) {}

    // Returns the object pointed by the object referenced by it
    reference operator*()  const { return **it; }
    pointer   operator->() const { return *it; }

    DerefIterator& operator++()
    {
        ++it;
        return *this;
    }

    DerefIterator operator++(int)
    {
        DerefIterator tmp = *this;
        ++it;
        return tmp;
    }

    bool equals(const DerefIterator<InputIterator> & di) const
    {
        return di.it == it;
    }

  private:
    InputIterator it;
};

// Equality functions

template <typename InputIterator>
inline bool operator==(const DerefIterator<InputIterator>& di1, 
                       const DerefIterator<InputIterator>& di2)
{
  return di1.equals(di2);
}

template <typename InputIterator>
inline bool operator!=(const DerefIterator<InputIterator>& di1, 
                       const DerefIterator<InputIterator>& di2)
{
  return ! (di1 == di2);
}

//Helper function

template <typename InputIterator>
DerefIterator<InputIterator> deref_iterator(const InputIterator& ii)
{
  return DerefIterator<InputIterator>(ii);
}
4
ответ дан 1 December 2019 в 03:52
поделиться

Принятие Вашего фактического варианта использования немного более сложно, чем контейнер целочисленных указателей!

Вы могли проверить повышение ptr контейнеры
http://www.boost.org/doc/libs/1_35_0/libs/ptr_container/doc/reference.html

, контейнеры содержат динамично выделенные объекты (т.е. указатели).
, Но весь доступ к объектам (прямой или через итератор) возвращает ссылку на объект.

#include <boost/ptr_container/ptr_vector.hpp>
#include <iostream>
#include <iterator>
#include <algorithm>

using namespace std;

int main()
{
  boost::ptr_vector<int> vec;

  vec.push_back(new int(1));
  vec.push_back(new int(2));
  vec.push_back(new int(3));

  copy(vec.begin(),vec.end(),
       ostream_iterator<int>(std::cout, " ")); // prints "1 2 3 "

  return 0;
}
4
ответ дан 1 December 2019 в 03:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: