13 Stimmen

Einfügevorrichtungen für STL-Stapel und priority_queue

std::vector , std::list y std::deque ont std::back_inserter y std::set hat std::inserter .

Für std::stack y std::priority_queue Ich würde annehmen, dass der entsprechende Inserter ein push() aber ich kann die richtige Funktion nicht finden, die ich aufrufen muss.

Ich möchte die folgende Funktion mit dem richtigen Insert-Iterator verwenden können:

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

5voto

Stuart Golodetz Punkte 19634

Die andere (einfachere) Alternative ist, einfach die zugrunde liegende Datenstruktur zu verwenden (std::stack wird normalerweise mit std::deque implementiert) und zu akzeptieren, dass man z.B. push_back() statt push() verwenden muss. Das erspart das Programmieren eines eigenen Iterators und beeinträchtigt die Klarheit des Codes nicht sonderlich. std::stack ist nicht die einzige Wahl für die Modellierung des Stack-Konzepts.

4voto

wheaties Punkte 34965

Sie können jederzeit Ihren eigenen Weg gehen und einen Iterator selbst implementieren. Ich habe diesen Code nicht überprüft, aber er sollte funktionieren. Betonung auf "Ich habe ihn nicht überprüft".

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

Ich würde auch die folgende Funktion einfügen, um die Verwendung zu erleichtern:

template<typename Container>
push_insert_iterator<Container> push_inserter(Container container){
    return push_insert_iterator<Container>(container);
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X