Могу ли я сгруппировать атрибуты одного класса в одну карту? - PullRequest
1 голос
/ 12 июня 2019

Если у меня есть класс "узел", и я хочу включить все возможные (скажем, int) атрибуты. Сгруппировать их в одну карту хорошее решение. Так что вместо:

    class node{
        int color;
        int isVisited;
        int weight;
    public:
    };

Чтобы иметь

    class node{
        map<string, int> property;
    public:
       setProperty(string property_label, int property_value) 
        {property[propery_label] = property_value;};

    };

    int main(){
        node n;
        n.setProperty("color",int(color::red));
        n.setProperty("isVisited", 1);
        n.setProperty("weight", 12);
    }

EDIT: Причина, по которой это делается, заключается в том, что при преобразовании графа некоторые локальные свойства (например, посещаемые при некотором обходе или помеченные) необходимы где-то в середине алгоритма, но эти локальные свойства не представляют внутреннее свойство узел, и не нужны в выводе. Кроме того, иногда мне нужно больше, чем одна переменная isVisited.

Еще одна причина - сделать класс "узел" универсальным и открытым для новых атрибутов, которые в конечном итоге могут понадобиться.

Ответы [ 2 ]

3 голосов
/ 12 июня 2019

В приведенном вами примере создается впечатление, что любой узел будет иметь все предоставленные вами свойства (colour, isVisited, weight). Если это так, то (обычно) лучше сохранить исходный класс, с которого вы начали.

Возможно, есть несколько сценариев, в которых карта (или, скорее, std::unordered_map) может быть лучше; всего несколько примеров:

  • У вас есть большое количество возможных (но предопределенных) атрибутов, и каждому узлу требуется лишь небольшое подмножество. Возможно, enum лучше подходит как key.
  • Вы хотите / должны хранить произвольные атрибуты, неизвестные во время компиляции.
  • Каждый узел имеет одинаковые атрибуты, но вы в основном получаете к ним доступ через пользовательский ввод; тогда особенно unordered_map может быть быстрее (возможно, длинной) цепочки if-else.

В конце концов, все зависит от варианта использования ...

Для строк в качестве ключей, возможно, trie также может быть интересной альтернативой.

0 голосов
/ 12 июня 2019

A class (идентично struct, за исключением того, что по умолчанию private access вместо public) в основном объединяет элементы данных и / или функциональности вместе.

You node кажется, просто сгруппировать три элемента.Так что вы, вероятно, хотите начать с чего-то простого:

struct node // access is public by default
{
    int color;
    int isVisited;  // maybe a bool rather than int?
    int weight;
}
...
node myNode;
myNode.color = ...
...
std::cout << myNode.weight;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...