Вставки для стека STL и priority_queue
std::vector
, std::list
а также std::deque
иметь std::back_inserter
, а также std::set
имеет std::inserter
,
За std::stack
а также std::priority_queue
Я бы предположил, что эквивалентный вставщик будет push()
но я не могу найти правильную функцию для вызова.
Мое намерение состоит в том, чтобы иметь возможность использовать следующую функцию с правильным итератором вставки:
#include <string>
#include <queue>
#include <iterator>
template<typename outiter>
void foo(outiter oitr)
{
static const std::string s1 ("abcdefghji");
static const std::string s2 ("1234567890");
*oitr++ = s1;
*oitr++ = s2;
}
int main()
{
std::priority_queue<std::string> spq;
std::stack<std::string> stk;
foo(std::inserter(spq));
foo(std::inserter(stk));
return 0;
}
2 ответа
Другая альтернатива (более простая) - просто использовать базовую структуру данных (std::stack обычно реализуется с использованием std::deque) и принять, что вы должны использовать, например, push_back() вместо push(). Избавляет от необходимости кодировать собственный итератор и не влияет на ясность кода. std::stack не единственный ваш выбор для моделирования концепции стека.
Вы всегда можете пойти своим путем и реализовать итератор самостоятельно. Я не проверял этот код, но он должен работать. Акцент на "Я не подтвердил".
template <class Container>
class push_insert_iterator:
public iterator<output_iterator_tag,void,void,void,void>
{
protected:
Container* container;
public:
typedef Container container_type;
explicit push_insert_iterator(Container& x) : container(&x) {}
push_insert_iterator<Container>& operator= (typename Container::const_reference value){
container->push(value); return *this; }
push_insert_iterator<Container>& operator* (){ return *this; }
push_insert_iterator<Container>& operator++ (){ return *this; }
push_insert_iterator<Container> operator++ (int){ return *this; }
};
Я также добавил бы следующую функцию, чтобы помочь использовать его:
template<typename Container>
push_insert_iterator<Container> push_inserter(Container container){
return push_insert_iterator<Container>(container);
}