С C ++ 17 вы также можете вернуть одно или более неизменяемых / непокрытых значений (в некоторых случаях). Возможность возврата неизменяемых типов осуществляется с помощью новой гарантированной оптимизации возвращаемого значения, и она прекрасно сочетается с агрегатами и тем, что можно назвать конструкторами шаблона .
template
struct many {
T1 a;
T2 b;
T3 c;
};
// guide:
template
many(T1, T2, T3) -> many;
auto f(){ return many{string(),5.7, unmovable()}; };
int main(){
// in place construct x,y,z with a string, 5.7 and unmovable.
auto [x,y,z] = f();
}
Симпатичная вещь в том, что гарантировано не вызвать любого копирования или перемещения. Вы можете сделать пример many
struct variadic тоже. Дополнительная информация:
Вы также можете написать:
[e] * n
Обратите внимание, что если e, например, пустой список, вы получите список с n ссылками на тот же список, а не с n независимыми пустыми списками.
Тестирование производительности
На первый взгляд кажется , что повтор - это самый быстрый способ создать список из n одинаковых элементов:
>>> timeit.timeit('itertools.repeat(0, 10)', 'import itertools', number = 1000000)
0.37095273281943264
>>> timeit.timeit('[0] * 10', 'import itertools', number = 1000000)
0.5577236771712819
Но подождите - это не честный тест ...
>>> itertools.repeat(0, 10)
repeat(0, 10) # Not a list!!!
Функция itertools.repeat
на самом деле не создает список, она просто создает объект, который можно использовать для создания списка, если хотите! Давайте попробуем это еще раз, но преобразовав его в список:
>>> timeit.timeit('list(itertools.repeat(0, 10))', 'import itertools', number = 1000000)
1.7508119747063233
Итак, если вам нужен список, используйте [e] * n
. Если вы хотите генерировать элементы лениво, используйте repeat
.
>>> [5] * 4
[5, 5, 5, 5]
Будьте осторожны, когда повторяющийся элемент является списком. Список не будет клонирован: все элементы будут относиться к одному списку!
>>> x=[5]
>>> y=[x] * 4
>>> y
[[5], [5], [5], [5]]
>>> y[0][0] = 6
>>> y
[[6], [6], [6], [6]]
В Itertools есть функция только для этого:
import itertools
it = itertools.repeat(e,n)
Конечно, itertools
дает вам итератор вместо списка. [e] * n
дает вам список, но, в зависимости от того, что вы будете делать с этими последовательностями, вариант itertools
может быть гораздо более эффективным.