Элементы списка обновления Python по одному до достижения суммы (списка)

Компилятор будет генерировать код для каждого экземпляра шаблона при использовании шаблона во время этапа компиляции. В процессе компиляции и компоновки файлы .cpp преобразуются в чистый объектный или машинный код, который в них содержит ссылки или неопределенные символы, поскольку файлы .h, которые включены в ваш main.cpp, не имеют реализации YET. Они готовы быть связаны с другим объектным файлом, который определяет реализацию для вашего шаблона, и, следовательно, у вас есть полный исполняемый файл a.out. Однако, поскольку шаблоны необходимо обрабатывать на этапе компиляции, чтобы сгенерировать код для каждого экземпляра шаблона, который вы делаете в своей основной программе, ссылка не поможет, поскольку компиляция main.cpp в main.o, а затем компиляция вашего шаблона .cpp в template.o, а затем ссылка не будет достигать цели шаблонов, потому что я связываю различные экземпляры шаблонов с одной и той же реализацией шаблона! И шаблоны должны делать обратное, т. Е. Иметь одну реализацию, но допускать много доступных экземпляров посредством использования одного класса.

Значение typename T get заменяется во время этапа компиляции, а не на этапе связывания, поэтому, если я попытаюсь для компиляции шаблона без замены T в качестве конкретного типа значения, чтобы он не работал, потому что это определение шаблонов - это процесс времени компиляции, а мета-программирование btw - все об использовании этого определения.

0
задан datahappy 3 March 2019 в 16:58
поделиться

2 ответа

Вам нужно будет сохранить индекс, повторяя цикл вперед, когда вы достигнете конца:

i = 0
while sum(myList) != 22:
    myList[i] += 1
    i = (i + 1) % len(myList)

Выражение (i + 1) % len(myList) возвращает цикл назад к 0, когда вы в противном случае увеличьте i, чтобы выйти за пределы.

Демонстрация:

>>> myList = [0, 0, 0, 0, 0, 0]
>>> i = 0
>>> while sum(myList) != 22:
...     myList[i] += 1
...     i = (i + 1) % len(myList)
...
>>> myList
[4, 4, 4, 4, 3, 3]

Знайте, что есть , можно просто вычислить значения , не увеличивая при этом значения по одному, однако:

def distribute(oranges, plates):
    base, extra = divmod(oranges, plates)
    return [base + (i < extra) for i in range(plates)]

, который для вашего примера с 6 слотами и 22 предметами дает:

>>> distribute(22, 6)
[4, 4, 4, 4, 3, 3]
0
ответ дан Martijn Pieters 3 March 2019 в 16:58
поделиться

Вам даже не нужно зацикливаться, вы можете создать список напрямую:

target = 22
length = 6

quotient, remainder = divmod(target, length)

out = [quotient+1] * remainder + [quotient] * (length-remainder)

print(out, sum(out))
# [4, 4, 4, 4, 3, 3] 22
0
ответ дан Thierry Lathuille 3 March 2019 в 16:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: