priority_queues в C ++ - PullRequest
       18

priority_queues в C ++

1 голос
/ 26 ноября 2010

Я немного новичок для итераторов.Я пытаюсь создать priority_queue, отсортированный по длине вектора.(Т.е. я хочу вытащить самые длинные векторы по порядку.)

Это ресурс, который я использовал:

http://www.cplusplus.com/reference/stl/priority_queue/priority_queue/

Я пробовал этокод, и он, кажется, делает то, что я хочу:

// testing to make sure that a priority queue will always give me the longest vector
priority_queue< vector<int> > q;

vector<int> f;
f.push_back(1);

vector<int> g;
g.push_back(19);
g.push_back(80);

vector<int> y;
y.push_back(62);
y.push_back(10);
y.push_back(11);

q.push(f);
q.push(g);
q.push(y);

vector<int> out = q.top();

for (unsigned int i = 0; i < out.size(); i++) {
    cout << out[i] << endl;
}

Мои вопросы: 1. Это всегда даст мне самый длинный вектор?Кажется, это так.2. Если нет, что еще мне делать?Синтаксис итератора на странице ссылок похож на ... o_O

Спасибо !!

Ответы [ 2 ]

6 голосов
/ 26 ноября 2010

Нет, код не делает то, что вы ожидаете.Он сравнивает векторы лексикографически, а не по длине.Для сравнения по длине используйте пользовательский компаратор:

struct LengthCompare {
    bool operator() (const vector<int>& a, const vector<int>& b) {
        return a.size() < b.size();
    }
};

priority_queue<vector<int>, vector<vector<int> >, LengthCompare> q;

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

0 голосов
/ 26 ноября 2010

priority_queues в C ++ использует объект Comparison, чтобы определить, какой элемент больше.По умолчанию это оператор <(меньше чем) над объектами, содержащимися в priority_queue - поэтому вам необходимо знать, что означает <над векторами.Эта страница <a href="http://www.cplusplus.com/reference/stl/vector/operators/" rel="nofollow">http://www.cplusplus.com/reference/stl/vector/operators/ содержит некоторую информацию об этом.

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