SourcePawn [SourcePawn] Урок 10 - ADT Trie (StringMap)

Pushistik↯❤

Команда форума
Регистрация
6 Июл 2017
Сообщения
393
Реакции
97
Баллы
28
[SourcePawn] Урок 10 - ADT Trie (StringMap)
<= К содержанию
StringMap - производный тип от Handle, который являет собою автоматически расширяемый массив, позволяющий хранить в себе данные разных и почти любых типов.
Размер массива увеличивается по мере добавления в него данных. Так же он уменьшается при удалении данных.
Основным отличием от ADT Array (ArrayList) является то, что запись и обращение к элементам массива происходит не по индексам, а по ключам.
Ключ - уникальная строка. Для каждого ключа может сущевствовать только 1 элемент.

Методы для работы с StringMap можно найти здесь StringMap· adt_trie SourceMod Scripting API Reference

Рассмотрим их подробнее:
  • Методы StringMap
    • StringMap - Создает объект типа StringMap
      PHP:
      StringMap hTrie = new StringMap();
    • SetValue - Добавляет элемент в StringMap. Возвращает true в случае успеха.
      PHP:
      hTrie.SetValue("ключ 1", 6);
      hTrie.SetValue("ключ 2", 7.3);
      // В качестве ключа мы можешь использовать любые значения, которые нам удобно.
      • bool replace - Если установлено true, то при совпадении ключа значение для него будет перезаписано. По умолчанию = true.
    • SetString - Добавляет элемент типа char в StringMap. Возвращает true в случае успеха.
      PHP:
      hTrie.SetString("ключ 1", "my string");
      hTrie.SetString("ключ 2", "two string");
    • SetArray - Добавляет массив в StringMap. Возвращает true в случае успех
      PHP:
      hTrie.SetArray("ключ 1", {6, 9}, 2); // 6 и 9 элементы массива, 2 - размер массива
      hTrie.SetArray("ключ 2", {5.2304, -3412.340, 0.35}, 3); // Таким образом можно записывать координаты или углы (float[3])
    • Get - Получает значение из StringMap. Возвращает true в случае успеха.
      PHP:
      int iVar1;
      if(hTrie.GetValue("ключ 1", iVar1))
      {
          // ...
      }
      float fVar2;
      if(hTrie.GetValue("ключ 2", fVar2))
      {
          // ...
      }
    • GetString - Получает строчное (char) значение из StringMap. Возвращает true в случае успеха.
      PHP:
      char szBuffer[64];
      hTrie.GetString("ключ 1", szBuffer, sizeof(szBuffer)); // Индекс 4
    • GetArray - Получает массив из StringMap. Возвращает true в случае успеха.
      PHP:
      int iArray[2];
      hTrie.GetArray("ключ 1", iArray, 2); // Размер массива = 2
      
      float fPosition[3];
      hTrie.GetArray("ключ 2", fPosition, 3); // Размер массива = 3
    • Clear - Очищает StringMap.
      PHP:
      hTrie.Clear();
    • Remove - Удаляет значение из StringMap.
      PHP:
      hTrie.Remove("ключ 2");
    • Snapshot - Создает для StringMap вспомогательный тип StringMapSnapshot.
      PHP:
      StringMapSnapshot hTrieSnapshot = hTrie.Snapshot();
StringMapSnapshot - дополнение позволяющее получать имена ключей StringMap
Методы StringMapSnapshot:
  • GetKey - Получает имя ключа по его индексу.
  • KeyBufferSize - Получает размер буфера необходимый для получения ключа (Размер+1).
  • Свойство Length - Получает количество ключей.
Этот тип является вспомогательным для StringMap.
При этом нельзя создать объект типа StringMapSnapshot как любой другой. Его можно только получить из объекта типа StringMap.
  • Свойства StringMap
    • Length - Получает количество элеметов в StringMap
      PHP:
      // Имеем StringMap:
      //    "key0" - 7
      //    "key1" - 32.5
      //    "key2" - 587
      //    "key3" - 2.23
      int iSize = hTrie.Size;
      // iSize = 4
PHP:
public void OnPluginStart()
{
    StringMap hTrie = new StringMap();

    hTrie.SetString("key 1", "dfsknj234");
    hTrie.SetString("key 2", "d2knj234");
    hTrie.SetString("key 3", "564sdf");

    hTrie.SetValue("int_ket", 1930);

    hTrie.SetArray("arr_key", {4, 6, 2}, 3);

    hTrie.Remove("int_ket");
    hTrie.Remove("arr_key");

    hTrie.SetString("key 5", "dffsk234dafnj234");
    hTrie.SetString("key 8", "d2kn324123j234");
    hTrie.SetString("key 9", "fghds");

    StringMapSnapshot hTrieSnapshot = hTrie.Snapshot();
    int i, iSize;
    char szBuffer[64], szKey[32];
    iSize = hTrieSnapshot.Length;
    PrintToServer("Size(hTrieSnapshot) = %i", iSize);
    for(i = 0; i < iSize; ++i)
    {
        hTrieSnapshot.GetKey(i, szKey, sizeof(szKey));
        PrintToServer("hTrieSnapshot[%i] = '%s'", i, szKey);
        hTrie.GetString(szKey, szBuffer, sizeof(szBuffer));
        PrintToServer("hTrie[%s] = '%s'", szKey, szBuffer);
    }

    delete hTrie;
}
Результаты:
PHP:
Size(hTrieSnapshot) = 6
hTrieSnapshot[0] = 'key 1'
hTrie[key 1] = 'dfsknj234'
hTrieSnapshot[1] = 'key 2'
hTrie[key 2] = 'd2knj234'
hTrieSnapshot[2] = 'key 3'
hTrie[key 3] = '564sdf'
hTrieSnapshot[3] = 'key 5'
hTrie[key 5] = 'dffsk234dafnj234'
hTrieSnapshot[4] = 'key 8'
hTrie[key 8] = 'd2kn324123j234'
hTrieSnapshot[5] = 'key 9'
hTrie[key 9] = 'fghds'

<= К содержанию
 
Последнее редактирование:
Сверху Снизу