Это определенно не «легкий путь» (это может быть не проще, чем то, что вы делаете с «+»), но я считаю, что это более полезно, чем в некоторых случаях иметь дело с видом на часы. Это также может позволить вам выполнить отладку в действительно плохих обстоятельствах (когда представление наблюдения практически не работает по какой-либо причине или когда у вас просто есть файл двоичного дампа памяти).
С помощью std :: list у вас обычно есть реализация, которая выглядит примерно так в памяти (обратитесь к за подробностями при необходимости):
struct List
{
Node * next;
Node * prev;
size_t size;
}
template
struct Node
{
Node * next; // last node will point to list rather than another node
Node * prev; // first node will point to list rather than another node
T payload; // e.g. in a std::list this would be a Foo * payload
}
Обратите внимание, что next и prev могут быть в обратном порядке в вашей реализации.
& myList в большинстве случаев эквивалентен "end ()".
Если вы используете вид памяти, вы можете осматриваться рядом с & myList. Это позволит вам найти значение указателя myList.prev или myList.next, а затем изменить представление памяти, чтобы посмотреть на это. Затем вы попали на последний или первый узел в вашем списке соответственно.
Как только вы доберетесь до узла, вы можете посмотреть на prev, next или payload, а затем перейти к prev или next; вспенить, промыть, повторить. Если вы снова окажетесь в & myList, вы узнаете, что прошли через все это.
Больно и скучно? Возможно. Но вы хорошо знакомы с вашей реализацией stl, в некоторых случаях вы легко «видите» возможные помехи, и это полезный навык, когда все другие возможности вылетают из окна.
(Ведите записи о том, где вы были, запутаться очень легко.)