C ++ как работать со связанным списком, тип данных которого - пара? - PullRequest
0 голосов
/ 06 августа 2020

У меня есть связанный список:

LinkedList > thelist;

Итак, точное объявление:

LinkedList <<strong> std :: pair > thelist;

Предположим, я сохранил серию Process внутри списка, и первый тип данных пары (т.е. string ) идентифицирует что это за категория процесса. Скажем, если выбрана категория «Стоп», она сохраняет Процесс внутри списка в разделе «Стоп», а если категория - «Возобновить»: Процесс сохраняется в разделе «Возобновить» и т. Д. Моя проблема в том, что я изо всех сил пытаюсь получить доступ к двум типам данных в паре для других методов, которые мне необходимо реализовать. Например: мне нужно реализовать метод под названием Count_category (строковая категория), который будет подсчитывать количество процессов внутри данной категории, но я не могу понять, как это сделать, поскольку я не знаю, как получить доступ к первому тип данных. Я до сих пор понял, что к нему можно получить доступ, выполнив такие же действия, как class.first и class.second, но не могу понять, как я бы использовал его в моем случае. Помогите !!

Я включаю свой связанный список.hpp, если вам нужен мой объект класса, который используется в паре, дайте мне знать.


        #ifndef LINKED_LIST_
        #define LINKED_LIST_
  
        #include <utility> //for swap
        #include <exception>
  
 #include "Node.hpp"
  
 template<typename T>
 class LinkedList
 {
 private:
    Node<T>* head; // Pointer to first node in the chain;
                             // (contains the first entry in the list)
    int count;           // Current count of list items 
    
    // Locates a specified node in this linked list.
    // @pre  position is the number of the desired node;
    //       position >= 1 and position <= itemCount.
    // @post  The node is found and a pointer to it is returned.
    // @param position  The number of the node to locate.
    // @return  A pointer to the node at the given position.
    Node<T>* getNodeAt(int position) const;
     void swap( LinkedList& lhs, LinkedList& rhs );
  
 public:
    LinkedList();
    LinkedList(const LinkedList<T>& rhs);
    virtual ~LinkedList();
    LinkedList& operator=( LinkedList rhs );
  
    bool isEmpty() const;
    int get_count() const;
    bool insert(int newPosition, const T& newEntry);
    bool remove(int position);
    void clear();
    
    T getEntry(int position) const;
    T replace(int position, const T& newEntry);
  
 }; // end LinkedList
#endif

``````````````````````````````````````````````````````````````



##This is where I'm stuck: (it's in a different class called PManager that uses this Linked List);##


``````````````````````````````````````````````````````````````````

int PManager::count_category(std::string category) const
{
int count = 0;
    for (int i = 1; i <= theList.get_count(); i++)
    {
        if (category == (this is where I need to access the category from the pair)
    {
        count++;
    }
}
```````````````````````````````````````````````````````

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

С интерфейсом, который вы представляете, это будет примерно так:

int main()
{
    LinkedList< std::pair< std::string, Process > > list;

    //... put in some data

    // count all elements in a given category

    std::string what{"Stop"};
    int found = 0;

    for ( int count = 0; count < list.get_count(); count++ )
    {
        std::pair< std::string, Process > element = list.getEntry( count );
        if ( element.first == what ) 
        {   
            found++;
        }   
    }

    std::cout << "Found " << found << " elements in category " << what << std::endl;
}

Ваш класс LinkedList имеет очень плохой дизайн из-за:

  • нет итераторов, поэтому он не может использоваться со стандартными алгоритмами
  • метод получения возвращает полную копию, неэффективен, изменение данных невозможно
  • методы доступа должны проходить через все элементы, что абсолютно неприемлемо
  • конструкторы не позволяли помещать данные в
  • конструкцию без перемещения
  • вставлять только с заданной позицией, требуется много итераций, неэффективно и сложно обрабатывать
  • без фронта ( ) и back () операторы
  • .... намного больше

Если вы используете stl-совместимый интерфейс для связанного списка, вы можете гораздо проще реализовать эту функциональность. Только в качестве примера для C ++ 20:

#include <ranges>
#include <algorithm>
#include <list>
#include <iostream>

class Process{};

int main()
{
    std::list< std::pair< std::string, Process > > l{ { "Stop", {} }, {"Resume",{}},{"Stop",{}}};
    std::string what{"Resume"};
    int found = std::ranges::count_if( l | std::views::keys , [&what]( const auto&s ){return s==what;} );
    std::cout << "Found " << found << " elements in category " << what << std::endl;
}
0 голосов
/ 06 августа 2020

Предположим, вы получили элемент (или ссылку на него) из LinkedList:

std::pair <std::string, Process> const& elem = llist.getEntry(0);
// now elem.first is a std::string

elem - это (ссылка на) std::pair <std::string, Process>. Затем вы можете использовать elem.first (это std::string) и elem.second (это Process).

Обратите внимание, что getEntry неэффективен: он возвращает копию элемента в списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...