std::stack
bietet eine streng letzte Ansicht des zugrunde liegenden Containers, und das ist der Sinn: die Verwendung des zugrunde liegenden Containers auf LIFO zu beschränken.
Und so bietet es keine Iteration.
Allerdings bietet es den zugrunde liegenden Container als protected
Mitglied, was bedeutet, dass es für abgeleitet werden soll. In Ihrer abgeleiteten Klasse können Sie Iteratoren und was immer Sie wollen bereitstellen. Es ist auch möglich, einfach auf das protected
Mitglied eines gewöhnlichen std::stack
zuzugreifen, auch ohne irgendeine Umwandlung zu verwenden (nämlich durch implizite Umwandlung von Mitgliedsdatenzeiger).
Re die zusätzlichen 2 nd Frage,
”, warum es keinen Sinn macht Iteratoren für Stapel zu haben?
Es kann sinnvoll sein, aber in den meisten Fällen wäre es den nicht-LIFO-Zugang zur Verfügung stellt, dass std::stack
ausgelegt ist, zu entfernen, das heißt in den meisten Fällen im Widerspruch zu dem Zweck der std::stack
wäre.
Zum Debuggen zeigt der Debugger den Inhalt einer std::stack
, so dass es keine große Notwendigkeit gibt, direkte Unterstützung dafür in Code zu haben.
Beispiel:
#include <iostream>
#include <stack>
namespace cppx {
using std::stack;
namespace hack {
template< class Item >
auto container_of(stack<Item> const& st)
-> typename stack<Item>::container_type const&
{
struct Hacked: stack<Item> { using stack<Item>::c; };
return st.*&Hacked::c;
}
} // namespace hack
template< class Item >
auto begin(stack<Item> const& st)
{ return hack::container_of(st).begin(); }
template< class Item >
auto end(stack<Item> const& st)
{ return hack::container_of(st).end(); }
} // namespace cppx
auto main()
-> int
{
using namespace std;
stack<int> st;
for(int const x : {3, 1, 4, 1, 5, 9, 2, 6, 5, 4})
{
st.push(x);
}
using cppx::begin; using cppx::end;
for(auto it = begin(st); it != end(st); ++it)
{
cout << *it << " ";
}
cout << endl;
}
Da in diesem Beispiel begin
und end
im Namensraum nicht platziert sind std
ein Bereich basierend Schleife würde nicht kompiliert.
Ich habe das nicht getan, weil die Legalität (Gültigkeit) der Spezialisierung einer Standardfunktion für einen Standardcontainer, in Namespace std
, ein Problem ist, das ich hier nicht eingehen möchte. Ich denke, es ist nicht erlaubt, obwohl die Spezialisierung auf den eigenen Typ in Ordnung wäre. Aber ich bin mir nicht sicher.
Werfen Sie einen Blick auf die Dokumentation ... http: //www.cplusplus.com/reference/stack/stack/ Gibt es einen Iterator? Nopp. Start() ? Nopp. – SnoozeTime