Генерация карты строк в std :: список указателей в c ++ - PullRequest
1 голос
/ 07 июня 2019

Я пытаюсь добиться создания такой карты. Следующий код пытается сделать это

#include <list>
#include <map>
#include <string>

class IntWithString {
private:
  int a;
  std::string s;

public:
  IntWithString(int a, std::string s) : a(a), s(s) {}
  std::string getString() { return s; }
  int getInt() { return a; }
};

namespace {
std::map<std::string, std::list<IntWithString *> > m;
}

void appendMap(IntWithString *a) {
  auto it = m.find(a->getString());
  if (it != m.end()) {
    m[a->getString()].push_back(a);
  } else {
    std::list<IntWithString *> l;
    l.push_back(a);
    m[a->getString()] = l;
  }
}

int main() {
  IntWithString a(10, "ten");
  IntWithString b(11, "ten");
  appendMap(&a);
  appendMap(&b);
  return 0;
}

Однако, глядя на карту m с помощью отладчика, я получаю карту, которая отображает «десять» в список размера 0. Что мне хотелось бы, так это список размера 2.

1 Ответ

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

Я не уверен, что вы имеете в виду. Если я сделаю:

std::cout << m.size() << ", " << m["ten"].size() << std::endl;

Я получаю этот вывод:

1, 2

, которая является картой с одним ключом («десять») и двумя значениями для этого ключа (10 и 11), как и ожидалось.

Демонстрационная версия

PS: Хранение указателей в контейнере, как это, немного необычно в C ++. Если вы действительно хотите сделать это, попробуйте использовать Умные указатели .

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