Просто выбросьте это: если вам нужно сопоставить более чем одну строку, например 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']
Попробуйте Повышение indirect_iterator
.
indirect_iterator
имеет ту же категорию как итератор, который она переносит. Например, indirect_iterator<int**>
итератор произвольного доступа.
Если это - невозможное Повышение использования, пишущий, что пользовательский итератор не это трудно. Вот пример, "разыменовывают итератор", который отвечает требованиям 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);
}
Принятие Вашего фактического варианта использования немного более сложно, чем контейнер целочисленных указателей!
Вы могли проверить повышение 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;
}