Squeak.ru - шаблоны программирования

вызов карты внутри карты

во-первых, я новичок в cpp. Как мы можем определить карту внутри карты, например

std::  map<std ::string,int> map_0={{"hello",1},{"a",3},{"b",5}}
std::  map<std ::string,int> map_1={{"hi",2},{"2",3},{"3",4}} 

теперь я хочу назначить новый элемент, который может ссылаться на мою карту_0, например

     map_1["print"] = (int) & map_0;

(только что записал, я не знаю правильного выражения для выражения здесь), чтобы я мог сделать что-то вроде $map_1["print"]=\%map_0; в Perl

15.06.2017


Ответы:


1

Ключевые моменты: попытка наивного переноса Perl-кода на C++ может быть довольно сложной; то, как структуры данных работают в этих двух языках, сильно различается. Вы говорите, что вы новичок в C++... это означает, что вы, возможно, не лучший человек для такого языкового перевода. Тем не менее, вот некоторые возможности.


Вы не можете тривиально сделать это на языке со строгой статической типизацией, таком как C++. Вы могли бы использовать что-то вроде std::variant в C++17, чтобы сделать это, позволяя вашим элементам map быть int или другим map, или, может быть, std::any (также в C++17), так что пусть карта вообще содержит что-либо (самое близкое к поведение Perl, которое вы, вероятно, получите). Ни один из этих типов не является полностью простым в использовании по сравнению с perl... вам нужно проверить, какой тип был сохранен в контейнере, и использовать соответствующую функцию доступа, иначе вы получите ошибку компиляции или ошибку времени выполнения, в зависимости от обстоятельств. Документы читать обязательно!

Вот пример std::variant. Вы можете видеть, что объявления вложенных типов могут довольно быстро стать спамом, если вам нужно несколько уровней карт, поэтому это может не полностью подходить для ваших нужд.

  std::map<std::string, std::variant<int, std::map<std::string, int>>> m;

  m["foo"] = 1;
  m["bar"] = std::map<std::string, int>{ {"baz", 2} };
  m["bar"] = 3;

  std::cout << std::get<int>(m["bar"]) << "\n";

Вы можете использовать std::variant::index, чтобы узнать, какой из списка типов в настоящее время хранится в variant, среди прочего.

Существуют различные библиотеки, которые предлагают тип варианта, который будет работать в старых компиляторах и стандартных библиотеках, или вы даже можете создать свой собственный (хотя, возможно, это того не стоит). Есть также вещи, называемые «теговыми союзами», которые очень похожи.

Вот пример std::any. Преимущество этого заключается в том, что вы можете использовать несколько уровней вложенных карт, не нуждаясь в огромных определениях типов.

  std::map<std::string, std::any> m2;

  m2["foo"] = 1;
  m2["bar"] = std::map<std::string, int>{ { "baz", 2 } };
  m2["bar"] = 3;
  m2["qux"] = m;

  std::cout << std::any_cast<int>(m2["bar"]) << "\n";

Вы можете использовать std::any::type, чтобы увидеть, какой конкретный тип any содержит в определенного типа, чтобы вы знали, какой тип any_cast использовать.

Для использования этих функций вам понадобится новый компилятор... Я использовал Visual Studio 2017 с /std:c++latest и g++ 7.1 с -std=c++17. Эти функции могут быть недоступны для вас, если вы используете старые компиляторы.

15.06.2017
  • Мистер Рук, есть ли возможный способ сделать этот тип преобразования i perl to c ++ $lastTxCtlEntry->{status} = \@tmp; 17.06.2017
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...