Изо всех сил пытается создать Boost-Bimap, содержащий std :: bitset - PullRequest
2 голосов
/ 12 октября 2019

У меня есть несколько строк и их битовых эквивалентов. Мне нужно иметь возможность искать эквиваленты в обоих направлениях, то есть " str to bitset " и " bitset to str ". Я считаю, что boost-bimap был бы подходящим контейнером для этой работы.

Мне удалось заставить его работать со строками и целыми числами, но мой bimap string / bitset не компилируется. Я использую VS2019 с последней версией буста.

Целочисленный пример работает:

#include <boost/bimap.hpp>
#include <string>
#include <iostream>

int main()
{
    typedef boost::bimap<std::string, int> bimap_str_int_t;

    bimap_str_int_t bimap1;
    bimap1.insert(bimap_str_int_t::value_type("A", 1));
    std::cout << bimap1.left.at("A") << '\n';  //prints 1
    std::cout << bimap1.right.at(1) << '\n';   // prints A
}

Не удается скомпилировать пример Bitset:

#include <boost/bimap.hpp>
#include <string>
#include <iostream>
#include <bitset>

int main()
{
    typedef std::bitset<3> bitset_t;
    typedef boost::bimap<std::string, bitset_t> bimap_str_bitset_t;

    bimap_str_bitset_t bimap2;
    bitset_t bits{ "010" };

    bimap2.insert(bimap_str_bitset_t::value_type("A", bits));
    std::cout << bimap2.left.at("A") << '\n';
    std::cout << bimap2.right.at(bits) << '\n';
}

В примере с набором битов создается следующееошибка компилятора:

boost_test.cpp (20): сообщение: см. ссылку на создание экземпляра шаблона класса 'boost :: bimaps :: bimap'

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

1 Ответ

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

Проблема в том, что std::bitset не имеет operator< - одно из требований к любой упорядоченной коллекции, подобной STL.

Чтобы исправить это, вам нужно предоставить функцию сравнения - вот один из способовможет попробовать:

#include <boost/bimap.hpp>
#include <string>
#include <iostream>
#include <bitset>

typedef std::bitset<3> bitset_t;
struct compare_bitset {
    bool operator()(const bitset_t& x, const bitset_t& y) const {
        return x.to_ulong() < y.to_ulong();
    }
};

int main()
{
    using bitset_set = boost::bimaps::set_of<bitset_t, compare_bitset>;
    typedef boost::bimap < std::string, bitset_set> bimap_str_bitset_t;

    bimap_str_bitset_t bimap2;
    bitset_t bits{ "010" };

    bimap2.insert(bimap_str_bitset_t::value_type("A", bits));
    std::cout << bimap2.left.at("A") << '\n';
    std::cout << bimap2.right.at(bits) << '\n';
}
...