Стандартная библиотека коллекции Rust обеспечивает эффективную реализацию наиболее распространенных структур данных программирования общего назначения. В этой главе обсуждается реализация часто используемых коллекций — Vector, HashMap и HashSet.
Вектор
Вектор — это массив с изменяемым размером. Он хранит значения в смежных блоках памяти. Предопределенная структура Vec может использоваться для создания векторов. Некоторые важные особенности вектора:
-
Вектор может расти или уменьшаться во время выполнения.
-
Вектор — это однородная коллекция.
-
Вектор хранит данные в виде последовательности элементов в определенном порядке. Каждому элементу в векторе присваивается уникальный номер индекса. Индекс начинается с 0 и продолжается до n-1, где n — размер коллекции. Например, в коллекции из 5 элементов первый элемент будет иметь индекс 0, а последний элемент — индекс 4.
-
Вектор будет добавлять значения только (или около) к концу. Другими словами, вектор может использоваться для реализации стека.
-
Память для вектора выделяется в куче.
Вектор может расти или уменьшаться во время выполнения.
Вектор — это однородная коллекция.
Вектор хранит данные в виде последовательности элементов в определенном порядке. Каждому элементу в векторе присваивается уникальный номер индекса. Индекс начинается с 0 и продолжается до n-1, где n — размер коллекции. Например, в коллекции из 5 элементов первый элемент будет иметь индекс 0, а последний элемент — индекс 4.
Вектор будет добавлять значения только (или около) к концу. Другими словами, вектор может использоваться для реализации стека.
Память для вектора выделяется в куче.
Синтаксис — Создание вектора
let mut instance_name = Vec::new();
Статический метод new () структуры Vec используется для создания экземпляра вектора.
Кроме того, вектор также может быть создан с помощью vec! макро. Синтаксис как указано ниже —
let vector_name = vec![val1,val2,val3]
В следующей таблице перечислены некоторые часто используемые функции структуры Vec.
Sr.No | метод | Подпись и описание |
---|---|---|
1 | новый () |
паб fn new () -> Vect Создает новый, пустой Vec. Вектор не будет выделяться, пока элементы не будут помещены в него. |
2 | От себя() |
pub fn push (& mut self, значение: T) Добавляет элемент в конец коллекции. |
3 | Удалить() |
pub fn удалить (& mut self, index: usize) -> T Удаляет и возвращает элемент с индексом позиции внутри вектора, смещая все элементы после него влево. |
4 | содержит() |
pub fn содержит (& self, x: & T) -> bool Возвращает true, если срез содержит элемент с заданным значением. |
5 | LEN () |
паб fn len (& self) -> использовать Возвращает количество элементов в векторе, также называемое его «длиной». |
паб fn new () -> Vect
Создает новый, пустой Vec. Вектор не будет выделяться, пока элементы не будут помещены в него.
pub fn push (& mut self, значение: T)
Добавляет элемент в конец коллекции.
pub fn удалить (& mut self, index: usize) -> T
Удаляет и возвращает элемент с индексом позиции внутри вектора, смещая все элементы после него влево.
pub fn содержит (& self, x: & T) -> bool
Возвращает true, если срез содержит элемент с заданным значением.
паб fn len (& self) -> использовать
Возвращает количество элементов в векторе, также называемое его «длиной».
Иллюстрация: Создание вектора — new ()
Чтобы создать вектор, мы используем статический метод new —
fn main() { let mut v = Vec::new(); v.push(20); v.push(30); v.push(40); println!("size of vector is :{}",v.len()); println!("{:?}",v); }
Приведенный выше пример создает вектор с использованием статического метода new (), который определен в структуре Vec . Функция push (val) добавляет значение, переданное в качестве параметра, в коллекцию. Функция len () возвращает длину вектора.
Выход
size of vector is :3 [20, 30, 40]
Иллюстрация: Создание вектора — vec! макрос
Следующий код создает вектор, используя vec! макро. Тип данных вектора выводится по первому значению, которое ему присвоено.
fn main() { let v = vec![1,2,3]; println!("{:?}",v); }
Выход
[1, 2, 3]
Как упоминалось ранее, вектор может содержать только значения одного и того же типа данных. Следующий фрагмент кода выдаст ошибку [E0308]: ошибка несовпадения типов .
fn main() { let v = vec![1,2,3,"hello"]; println!("{:?}",v); }
Иллюстрация: push ()
Добавляет элемент в конец коллекции.
fn main() { let mut v = Vec::new(); v.push(20); v.push(30); v.push(40); println!("{:?}",v); }
Выход
[20, 30, 40]
Иллюстрация: удалить ()
Удаляет и возвращает элемент с индексом позиции внутри вектора, смещая все элементы после него влево.
fn main() { let mut v = vec![10,20,30]; v.remove(1); println!("{:?}",v); }
Выход
[10, 30]
Иллюстрация — содержит ()
Возвращает true, если срез содержит элемент с заданным значением —
fn main() { let v = vec![10,20,30]; if v.contains(&10) { println!("found 10"); } println!("{:?}",v); }
Выход
found 10 [10, 20, 30]
Иллюстрация: len ()
Возвращает количество элементов в векторе, также называемое его «длиной».
fn main() { let v = vec![1,2,3]; println!("size of vector is :{}",v.len()); }
Выход
size of vector is :3
Доступ к значениям из вектора
К отдельным элементам в векторе можно получить доступ, используя их соответствующие номера индекса. В следующем примере создается векторная реклама, в которой печатается значение первого элемента.
fn main() { let mut v = Vec::new(); v.push(20); v.push(30); println!("{:?}",v[0]); } Output: `20`
Значения в векторе также могут быть получены с использованием ссылки на коллекцию.
fn main() { let mut v = Vec::new(); v.push(20); v.push(30); v.push(40); v.push(500); for i in &v { println!("{}",i); } println!("{:?}",v); }
Выход
20 30 40 500 [20, 30, 40, 500]
HashMap
Карта — это набор пар ключ-значение (называемых записями). Никакие две записи на карте не могут иметь одинаковый ключ. Короче говоря, карта — это справочная таблица. HashMap хранит ключи и значения в хеш-таблице. Записи хранятся в произвольном порядке. Ключ используется для поиска значений в HashMap. Структура HashMap определяется в модуле std :: collection . Этот модуль должен быть явно импортирован для доступа к структуре HashMap.
Синтаксис: создание HashMap
let mut instance_name = HashMap::new();
Статический метод new () структуры HashMap используется для создания объекта HashMap. Этот метод создает пустой HashMap.
Обычно используемые функции HashMap обсуждаются ниже —
Sr.No | метод | Подпись и описание |
---|---|---|
1 | вставить () |
pub fn insert (& mut self, k: K, v: V) -> Опция Вставляет пару ключ / значение, если ключа нет, то возвращается None. После обновления возвращается старое значение. |
2 | LEN () |
паб fn len (& self) -> использовать Возвращает количество элементов на карте. |
3 | получить() |
pub fn get <Q:? Sized> (& lself, k: & Q) -> Option <& V>, где K: Заимствовать Q: Hash + Eq Возвращает ссылку на значение, соответствующее ключу. |
4 | ITER () |
pub fn iter (& self) -> Iter <K, V> Итератор, посещающий все пары ключ-значение в произвольном порядке. Тип элемента итератора — (& ‘a K, &’ a V). |
5 | contains_key |
pub fn содержит ключ <Q:? Sized> (& self, k: & Q) -> bool Возвращает true, если карта содержит значение для указанного ключа. |
6 | Удалить() |
pub fn remove_entry <Q:? Sized> (& mut self, k: & Q) -> Option <(K, V)> Удаляет ключ с карты, возвращая сохраненный ключ и значение, если ключ был ранее на карте. |
pub fn insert (& mut self, k: K, v: V) -> Опция
Вставляет пару ключ / значение, если ключа нет, то возвращается None. После обновления возвращается старое значение.
паб fn len (& self) -> использовать
Возвращает количество элементов на карте.
pub fn get <Q:? Sized> (& lself, k: & Q) -> Option <& V>, где K: Заимствовать Q: Hash + Eq
Возвращает ссылку на значение, соответствующее ключу.
pub fn iter (& self) -> Iter <K, V>
Итератор, посещающий все пары ключ-значение в произвольном порядке. Тип элемента итератора — (& ‘a K, &’ a V).
pub fn содержит ключ <Q:? Sized> (& self, k: & Q) -> bool
Возвращает true, если карта содержит значение для указанного ключа.
pub fn remove_entry <Q:? Sized> (& mut self, k: & Q) -> Option <(K, V)>
Удаляет ключ с карты, возвращая сохраненный ключ и значение, если ключ был ранее на карте.
Иллюстрация: вставка ()
Вставляет пару ключ / значение в HashMap.
use std::collections::HashMap; fn main(){ let mut stateCodes = HashMap::new(); stateCodes.insert("KL","Kerala"); stateCodes.insert("MH","Maharashtra"); println!("{:?}",stateCodes); }
Вышеприведенная программа создает HashMap и инициализирует его двумя парами ключ-значение.
Выход
{"KL": "Kerala", "MH": "Maharashtra"}
Иллюстрация: len ()
Возвращает количество элементов на карте
use std::collections::HashMap; fn main() { let mut stateCodes = HashMap::new(); stateCodes.insert("KL","Kerala"); stateCodes.insert("MH","Maharashtra"); println!("size of map is {}",stateCodes.len()); }
Приведенный выше пример создает HashMap и печатает общее количество элементов в нем.
Выход
size of map is 2
Иллюстрация — получить ()
Возвращает ссылку на значение, соответствующее ключу. В следующем примере извлекается значение для ключа KL в HashMap.
use std::collections::HashMap; fn main() { let mut stateCodes = HashMap::new(); stateCodes.insert("KL","Kerala"); stateCodes.insert("MH","Maharashtra"); println!("size of map is {}",stateCodes.len()); println!("{:?}",stateCodes); match stateCodes.get(&"KL") { Some(value)=> { println!("Value for key KL is {}",value); } None => { println!("nothing found"); } } }
Выход
size of map is 2 {"KL": "Kerala", "MH": "Maharashtra"} Value for key KL is Kerala
Иллюстрация — iter ()
Возвращает итератор, содержащий ссылку на все пары ключ-значение в произвольном порядке.
use std::collections::HashMap; fn main() { let mut stateCodes = HashMap::new(); stateCodes.insert("KL","Kerala"); stateCodes.insert("MH","Maharashtra"); for (key, val) in stateCodes.iter() { println!("key: {} val: {}", key, val); } }
Выход
key: MH val: Maharashtra key: KL val: Kerala
Иллюстрация: contains_key ()
Возвращает true, если карта содержит значение для указанного ключа.
use std::collections::HashMap; fn main() { let mut stateCodes = HashMap::new(); stateCodes.insert("KL","Kerala"); stateCodes.insert("MH","Maharashtra"); stateCodes.insert("GJ","Gujarat"); if stateCodes.contains_key(&"GJ") { println!("found key"); } }
Выход
found key
Иллюстрация: удалить ()
Удаляет ключ с карты.
use std::collections::HashMap; fn main() { let mut stateCodes = HashMap::new(); stateCodes.insert("KL","Kerala"); stateCodes.insert("MH","Maharashtra"); stateCodes.insert("GJ","Gujarat"); println!("length of the hashmap {}",stateCodes.len()); stateCodes.remove(&"GJ"); println!("length of the hashmap after remove() {}",stateCodes.len()); }
Выход
length of the hashmap 3 length of the hashmap after remove() 2
HashSet
HashSet — это набор уникальных значений типа T. Быстрое добавление и удаление значений позволяет быстро узнать, есть ли заданное значение в наборе или нет. Структура HashSet определяется в модуле std :: collection. Этот модуль должен быть явно импортирован для доступа к структуре HashSet.
Синтаксис: Создание HashSet
let mut hash_set_name = HashSet::new();
Статический метод new структуры HashSet используется для создания HashSet. Этот метод создает пустой HashSet.
В следующей таблице перечислены некоторые из наиболее часто используемых методов структуры HashSet.
Sr.No | метод | Подпись и описание |
---|---|---|
1 | вставить () |
pub fn insert (& mut self, value: T) -> bool Добавляет значение в набор. Если в наборе не было этого значения, возвращается true, иначе false. |
2 | LEN () |
паб fn len (& self) -> использовать Возвращает количество элементов в наборе. |
3 | получить() |
pub fn get <Q:? Sized> (& self, value: & Q) -> Option <& T>, где T: Заимствовать, Q: Hash + Eq, Возвращает ссылку на значение в наборе, если оно совпадает с заданным значением. |
4 | ITER () |
pub fn iter (& self) -> Iter Возвращает итератор, посещающий все элементы в произвольном порядке. Тип элемента итератора — & ‘T. |
5 | contains_key |
pub fn содержит <Q:? Sized> (& self, value: & Q) -> bool Возвращает true, если набор содержит значение. |
6 | Удалить() |
pub fn remove <Q:? Sized> (& mut self, value: & Q) -> bool Удаляет значение из набора. Возвращает true, если значение присутствовало в наборе. |
pub fn insert (& mut self, value: T) -> bool
Добавляет значение в набор. Если в наборе не было этого значения, возвращается true, иначе false.
паб fn len (& self) -> использовать
Возвращает количество элементов в наборе.
pub fn get <Q:? Sized> (& self, value: & Q) -> Option <& T>, где T: Заимствовать, Q: Hash + Eq,
Возвращает ссылку на значение в наборе, если оно совпадает с заданным значением.
pub fn iter (& self) -> Iter
Возвращает итератор, посещающий все элементы в произвольном порядке. Тип элемента итератора — & ‘T.
pub fn содержит <Q:? Sized> (& self, value: & Q) -> bool
Возвращает true, если набор содержит значение.
pub fn remove <Q:? Sized> (& mut self, value: & Q) -> bool
Удаляет значение из набора. Возвращает true, если значение присутствовало в наборе.
Иллюстрация — вставить ()
Добавляет значение в набор. HashSet не добавляет повторяющиеся значения в коллекцию.
use std::collections::HashSet; fn main() { let mut names = HashSet::new(); names.insert("Mohtashim"); names.insert("Kannan"); names.insert("TutorialsPoint"); names.insert("Mohtashim");//duplicates not added println!("{:?}",names); }
Выход
{"TutorialsPoint", "Kannan", "Mohtashim"}
Иллюстрация: len ()
Возвращает количество элементов в наборе.
use std::collections::HashSet; fn main() { let mut names = HashSet::new(); names.insert("Mohtashim"); names.insert("Kannan"); names.insert("TutorialsPoint"); println!("size of the set is {}",names.len()); }
Выход
size of the set is 3
Иллюстрация — iter ()
Перезапускает итератор, посещающий все элементы в произвольном порядке.
use std::collections::HashSet; fn main() { let mut names = HashSet::new(); names.insert("Mohtashim"); names.insert("Kannan"); names.insert("TutorialsPoint"); names.insert("Mohtashim"); for name in names.iter() { println!("{}",name); } }
Выход
TutorialsPoint Mohtashim Kannan
Иллюстрация: get ()
Возвращает ссылку на значение в наборе, если оно есть, которое равно заданному значению.
use std::collections::HashSet; fn main() { let mut names = HashSet::new(); names.insert("Mohtashim"); names.insert("Kannan"); names.insert("TutorialsPoint"); names.insert("Mohtashim"); match names.get(&"Mohtashim"){ Some(value)=>{ println!("found {}",value); } None =>{ println!("not found"); } } println!("{:?}",names); }
Выход
found Mohtashim {"Kannan", "Mohtashim", "TutorialsPoint"}
Иллюстрация — содержит ()
Возвращает true, если набор содержит значение.
use std::collections::HashSet; fn main() { let mut names = HashSet::new(); names.insert("Mohtashim"); names.insert("Kannan"); names.insert("TutorialsPoint"); if names.contains(&"Kannan") { println!("found name"); } }
Выход
found name
Иллюстрация: удалить ()
Удаляет значение из набора.