Один из способов состоит в том, чтобы напечатать оба числа, когда вы обнаружили, что они являются последовательными, но также проверить, что номер по индексу i-1
не был в последовательном списке, так что номер по индексу i
не печатается дважды:
num = [8, 9, 4, 1, 2, 3]
for i in range(len(num)-1): # not using -1 will cause index error
if num[i] + 1 == num[i + 1]:
if i == 0 or (i - 1 >= 0 and num[i - 1] != num[i] - 1):
print('Con', num[i])
print('Con', num[i + 1])
Можно попробовать и с более сложным списком:
num = [8, 9, 4, 1, 2, 3, 4, 4, 8, 9, 1, 2, 3, 0, 1, 5, 6, 1]
for i in range(len(num)-1): # not using -1 will cause index error
if num[i] + 1 == num[i + 1]:
if i == 0 or (i - 1 >= 0 and num[i - 1] != num[i] - 1):
print('Con', num[i])
print('Con', num[i + 1])
Короткий ответ: нет, если вы сами не пишете такую процедуру вручную.
Что часто не плохая идея, но обычно возникают проблемы с синхронизацией с классом, если вы часто добавляете / меняете участников. Это неизбежно, потому что в C ++ отсутствует какая-либо форма самоанализа в struct
s.
Если вы решите пойти по этому пути, лучше всего написать перегрузку для std :: ostream & operator << (std :: ostream & os, MyClass const &)
, что позволит печатать ваш класс в любом выходном потоке IOStreams.
Обычно отладчики достаточно умны, чтобы делать это.
В GDB вы можете использовать:
print structure
и в NTSD Вы можете сделать очень круто:
dt -r structure
Если вы просто используете это для целей отладки, я настоятельно рекомендую научиться использовать отладчики. Даже если вы хотите что-то зарегистрировать (например, печатать миллион раз), вы можете установить макрос точки останова.
В NTSD:
bp yourdll!yourobject::yourfunction "dt -r structure;g"
И я уверен, что есть способ сделать это и в GDB
В дополнение к другим ответам, в зависимости от того, для чего вы этого хотите и хотите ли вы переносимости, вы можете потенциально посмотрите на получение необходимой информации из отладочной информации, которую генерирует ваш компилятор. Вы можете анализировать файл формата COFF / ELF / независимо от формата из сборки, и это дает вам информацию, необходимую для определения имен и типов переменных в вашем объекте.
Обычно не возможно в C ++, поскольку требует использования отражения, которого нет в C ++. Конечно, вы можете написать свою собственную функцию для дампа определенных структур данных.
Если вы добавите отражение в C ++ (используя стороннюю библиотеку или расширения поставщика), вы можете написать подпрограмму для использовать эти данные отражения для сброса произвольных структур. Например, у меня есть некоторый код, который использует библиотеку CERN Reflex для перебора членов класса или структуры и выгрузки их в YAML .
Действительно, в среде, где у вас есть GDB, и вы компилируете свои источники с включенными отладочными символами (например, - ggdb) у вас может быть свой отладчик (например, gdb из командной строки или ddd, если вы хотите что-то графически).
Рассмотрим этот фрагмент кода:
#include <string>
#include <vector>
struct test
{
int a;
float b;
std::string c;
};
int main()
{
std::vector<int> v;
test t;
t.a=1;
t.b=2.0;
t.c="hello there";
return 0;
}
При вежливом запросе gdb он может дать мне следующий вывод:
(gdb) break 20 Breakpoint 1 at 0x8048622: file bla.cpp, line 20. (gdb) run Starting program: /home/edb/a.out Breakpoint 1, main () at bla.cpp:21 21 return 0; (gdb) print t $1 = {a = 1, b = 2, c = {static npos = 4294967295, _M_dataplus = {> = {> = {}, }, _M_p = 0x96b6014 "hello there"}}} (gdb) ping v Undefined command: "ping". Try "help". (gdb) print v $2 = { >> = { _M_impl = {> = {> = {}, }, _M_start = 0x0, _M_finish = 0x0, _M_end_of_storage = 0x0}}, }
Редактировать: обратите внимание, что эти данные доступны из контекста отладчика, для генерации этих дампов во время выполнения вам потребуется Предвидеть свою собственную функцию дампа / форматирования, обычно это делается путем перегрузки оператора << в C ++.