Почему в Rust нет аналога Vec::with_capacity() такого как Vec::with_len()

Я знаю что можно написать так:

let v = Vec::with_capacity(n);
unsafe { v.set_len(n); }

Но почему в Rust нет возможности создать вектор данной длины не заполняя его (что не логично по производительности) или не прибегая к unsafe ?


Ответы (1 шт):

Автор решения: saintech

Насколько я понял из исходников - Vec::with_capacity как раз ничего не заполняет, а по описанию, делает именно то, о чем вы пишете - создает вектор заданной длины без заполнения. Естественно, при этом Rust защищает вас от доступа к мусорным значениям через length равным 0 (см Capacity and reallocation).

Все это сделано как раз для случаев когда вам нужна производительность - после вызова Vec::with_capacity vec.push не будет делать реалокацию. В идеале, при правильном переданном значении в Vec::with_capacity и дальнейшем заполнении массива значениями в цикле, у вас не будет ни одной реалокации массива и присваивание значения будет только один раз.

→ Ссылка