Найти длину ключа, цепочку создания стоимости в мультикарте - PullRequest
0 голосов
/ 17 октября 2019

У меня есть сетевая программа, которая позволяет пользователю добавлять 2 человек в мультикарту. Ключ - рекрутер, а значение - это человек, которого они добавляют, значение может добавить другого человека и так далее, и так далее. Вот пример

> add john mary
> add john tom
> add mary brad
> add tom Maria
> add mary Eli
> add brad Sofia

Если бы я напечатал цепочку Джона, я бы получил следующее.

> p john
john
..mary
....brad
......sofia
....eli
..tom
....maria

Мне нужно найти способ подсчитать длину цепи. В этом случае длина цепочки Джона равна 6, а у Мэри - 3.

Вот так я печатаю цепочку

void print_subnet(std::multimap<std::string, std::string>networkMap, std::string id, size_t count=2)
{
    for(auto itr = networkMap.begin(); itr != networkMap.end(); ++itr)
    {
        if(itr ->first == id)
        {
            std::cout << std::string(count, '.') << itr -> second << std::endl;
            print_subnet(networkMap, itr->second, count+2);
        }

    }
}

Я следовал аналогичной логике, чтобы получить длину цепочки,

  • для данного ключа, получить счет.
  • установить значение ключа в качестве нового ключа
  • повторять до конца карты.

Вот мой код.

 int count_size(std::multimap<std::string, std::string>networkMap, std::string id, int count)
    {
        for(auto itr = networkMap.begin(); itr != networkMap.end(); ++itr)
        {
            if(itr->first == id)
              {
                count += networkMap.count(id);
                count_size(networkMap, itr->second, count);
            }
        }
        return count;
    }

Я получаю ответ 4, когда он должен быть 6. Я распечатал значение счетчика, и это то, что я получил.

2 (2 from john)
4 (2 from mary)
5 (1 from brad)
6 (1 from tom)
4 ??
5 ??
4 ??

Я почти уверен, что упускаю что-то простое, но я занимался этим некоторое время, я не могу думать прямо.

1 Ответ

1 голос
/ 17 октября 2019

Этот код возвращает 6:

void count_size_recursive(std::multimap<std::string, std::string>networkMap, std::string id, int& count)
{
  for(auto itr = networkMap.begin(); itr != networkMap.end(); ++itr)
  {
    if(itr->first == id)
    {
      ++count;
      count_size_recursive(networkMap, itr->second, count);
    }
  }
}

int count_size(std::multimap<std::string, std::string>networkMap, std::string id)
{
  int count = 0;
  count_size_recursive(networkMap, id, count);
  return count;
}
...