make_heap не делает кучу - PullRequest
       15

make_heap не делает кучу

0 голосов
/ 30 марта 2011

У меня есть программа, которая переносит подмножество другого вектора в векторе, как ссылки на индексы.

std::vector<foo> knowledgeBase;
std::vector<int> workingSet;

Работает ли этот класс сравнения?

class Compare
{
    bool operator()(int lft, int rgt)
    {
        return knowledgeBase[lft].bar() > knowledgeBase[rgt].bar();
    }
};

Сравнение - этовложенный класс в классе, который содержит базу знаний, поэтому у меня есть доступ к переменным, но индекс, ссылающийся на наименьшее значение, никогда не возвращается workingSet.front ();

Что я делаю неправильно?Я могу опубликовать больше кода, если это необходимо (что имеет дополнительные несвязанные ошибки, которые я не могу проверить, потому что это не работает), но я точно знаю, что мой make_heap не создает нужную кучу.

В случае, если я делаю что-то действительно глупое, мой вызов make_heap выглядит следующим образом:

std::make_heap(workingSet.begin(), workingSet.end(), Compare());

Edit: bar - это размер () для std :: set internal для foo.Этот набор не является пустым и не определен, потому что я могу вывести его содержимое (и проверить его как правильное).Хотя для этого используется итератор ... разве этого недостаточно?

Edit2: После дальнейших исследований я обнаружил, что bar () всегда возвращает 1. Я добавил int и увеличивал его каждый раз, когда добавлялпеременная, вот так ...

foo::foo()
{
    siz = 0;
}

void foo::addLiteral(std::string var, bool truth)
{
    literals.insert(Literal(var,truth)); 
    ++siz;
}

class foo()
{
public:
    foo();
    void addLiteral(std::string var, bool truth);
    bool bar(){return siz;}
private:
    int siz;
    std::set<Literal, LiteralComp> literals;
}

foo инициализируется так:

...
   foo newClause;
    ss.str(input);
    ss >> variable;
    while(!ss.fail())
    {
        if(variable[0] == '~')
        {
            variable = variable.substr(1);
            truth = false;
        }
        else truth = true;
        newClause.addLiteral(variable, truth);
        ss >> variable;
    }
    knowledgeBase.push_back(newClause);
workingSet.push_back(count++);
...

И foo.size() по-прежнему всегда возвращает 1.

Что происходит?

Я понимаю, что это далеко выходит за рамки моего основного вопроса, и есть фрагменты, не определенные в приведенном мною коде, но я работаю над этой проблемой уже около шести часови до сих пор понятия не имею, что происходит.

Ответы [ 2 ]

1 голос
/ 31 марта 2011

... Теперь я чувствую себя глупо.

class foo()
{
public:
    foo();
    void addLiteral(std::string var, bool truth);
    bool bar(){return siz;} <==== returns a bool
private:
    int siz;
    std::set<Literal, LiteralComp> literals;
}

Извините, что зря потратил время.

0 голосов
/ 30 марта 2011

Вы не забыли оценить свой рабочий набор?Например, использование резерва и затем operator[] не увеличит фактический размер вектора, поэтому make_heap не будет работать.

...