Пытаюсь выучить boost :: intrusive Q2

если я раскомментирую эти

//BaseList   baselist; 
//MemberList memberlist;

вне цикла и закомментируйте те, что внутри цикла, он падает. Мне нужно иметь возможность иметь базовый список (и список участников) вне любого цикла. Как это достигается?

редактировать

Фактическая проблема, которую я пытаюсь решить в ее самой простой форме, состоит в следующем.

Я хочу, чтобы у меня был std :: vectorMyClassНазовите это AllThingsBunchedTogether. Я также хочу иметь std :: vectorBaseListНазовите это AllThingsSpreadOut.

Так

AllThingsBunchedTo Вместе может содержать (толькоanInt1 часть ради компактности):1,2,1,10,2,3,4,4,5,9,10,10.AllThingsSpreadOut может содержать (ноль пока не используется) в [1]1,1 в [2]2,2 в 3]3 в [4]4,4 в 5]5 в 9]9 в 10]10,10,10.

Обратите внимание, что сами цифры не хранятся вBaseListно, например,MyClass(1, «Джон»).

В [1] это может быть «Майк», «Джон», в [2] это может быть «Майк», «Дагобарт», в [3] «Джон» ... в [10] «Джон», «Майк» » Дагобарт "и т.д., чтобы не было дубликатов ни в одном изBaseList на AllThingsSpreadOut [i], так как каждыйMyClass в каждомBaseList хэши к другому значению (anInt1 + Name).

По сути,anInt1 говорит гдеMyClass живет в AllThingsSpreadOut, ноanInt1 + name гарантирует уникальность в каждомBaseList.

Таким образом, идея заключается в том, что AllThingsSpreadOut является векторомBaseList где у каждогоBaseList На векторной локации находится список похожих вещей.

Затем, когда я удаляю вещи из AllThingsBunchedTogether (не путем очистки, а путем поиска, чтобы удалить некоторые элементы, как в коде ниже IsMarkedToDelete), они автоматически исчезают из соответствующего AllThingsSpreadOut.

AllThingsSpreadOut действует как сортировка для AllThingsBunchedTogether с навязчивой семантикой. AllThingsBunchedTogether обеспечивает сверхбыстрый доступ через [].

Конец Править

#include <vector>
#include <iostream>

#include <boost/intrusive/list.hpp>

using namespace boost::intrusive;

class MyClass : public list_base_hook<link_mode<auto_unlink>> // This is a derivation hook
{
public:
    std::string name;
    bool bIsMarkedToDelete;
    int anInt1;
public:
    list_member_hook<link_mode<auto_unlink>> member_hook_; // This is a member hook

    MyClass(std::string n, int i) : name(n), anInt1(i), bIsMarkedToDelete(false) {}
};

bool IsMarkedToDelete(const MyClass &o)
{
    return o.bIsMarkedToDelete;
}

//Define a list that will store MyClass using the public base hook
typedef list<MyClass, constant_time_size<false>> BaseList;

// Define a list that will store MyClass using the public member hook
typedef list<MyClass,
        member_hook<MyClass, list_member_hook<link_mode<auto_unlink>>, &MyClass::member_hook_>,
        constant_time_size<false> > MemberList;

int main()
{
    bool done = false;
    std::vector<MyClass> values;

    std::string names[] = {"John", "Mike", "Dagobart"};

    //BaseList   baselist; 
    //MemberList memberlist;

    int i = 0;
    while(!done)
    {
        // Create several MyClass objects, each one with a different value

        for (int j = 0; j < 11; ++j)
            values.emplace_back(names[j % 3], j);

        BaseList   baselist;
        MemberList memberlist;

        // Now insert them in t-he reverse order in the base hook list
        for (auto& e : values)
        {
            baselist.push_front(e);
            memberlist.push_back(e);
        }

        // Now test lists
        auto rbit(baselist.rbegin());
        auto mit(memberlist.begin());
        auto it(values.begin()), itend(values.end());

        // Test the objects inserted in the base hook list
        for (; it != itend; ++it, ++rbit)
        {
            if (&*rbit != &*it)
                return 1;
        }
        // Test the objects inserted in the member hook list
        for (it = values.begin(); it != itend; ++it, ++mit)
        {
            if (&*mit != &*it)
                return 1;
        }
# if 0
        for(auto& e : values)
            std::cout << e.anInt1 << "\n";

        for(auto& e : baselist)
            std::cout << e.anInt1 << "\n";

        for(auto& e : memberlist)
            std::cout << e.anInt1 << "\n";

#endif // 0

        if(2 == i)
        {
            for(auto& e: values)
                std::cout << e.name << "\n";

            for(auto& e: values)
            {
                if("Mike" == e.name)
                    e.bIsMarkedToDelete = true;
            }

            values.erase(
                std::remove_if(values.begin(), values.end(), IsMarkedToDelete), values.end());
        }


        if(i++ > 3)
        {
            values.clear();
            done = true;
        }

        std::cout << "\n";
        std::cout << values.size()     << "\n";
        std::cout << baselist.size()   << "\n";
        std::cout << memberlist.size() << "\n";
    }
}

Ответы на вопрос(2)

Ваш ответ на вопрос