Учебники

Руст — Коллекции

Стандартная библиотека коллекции 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

Иллюстрация: удалить ()

Удаляет значение из набора.