Как скопировать весь вектор в очередь в обратном порядке?

#c #vector #queue #iteration

#c #вектор #очередь #итерация

Вопрос:

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

Использование случайного цикла for для итерации в обратном порядке по вектору, начиная с size-1 окончания при i равенстве -1 . Поскольку я использую -1 как правило, мне нужно использовать все int , что делает код уродливым.

 vector<unsigned> v;
v.pushback(2);
v.pushback(3);
v.pushback(5);

queue<unsigned> q;

for(int i = static_cast<int>(v.size()-1); i>=0; i--)
    q.push(v[static_cast<unsigned>(i)];
  

Может кто-нибудь сказать мне, как профессионалы это делают? Не могу найти что-нибудь вроде функции «копировать в обратном порядке», которая может начинаться с .end()-1 элемента и копировать все элементы, включая .begin() один?

Комментарии:

1. Используйте std::rbegin и std::rend

2. Я и раньше знал, что существуют rbegin и rend, и я не мог понять, почему люди не используют обычные begin() и end(), а меняют местами в коде, но точно знаю, что после повторного прочтения вашей ссылки я обнаружил, что end() и rbegin() указывают на разные места в памятиспасибо, чувак!

Ответ №1:

std::vector предоставляет функции rbegin и rend возвращает обратные итераторы, которые вы можете использовать для итерации от начала к началу. Используя те, которые вы можете использовать std::for_each для итерации вектора, а затем использовать лямбда-выражение в качестве функтора, чтобы поместить каждый элемент в очередь. Это будет выглядеть так

 std::vector<int> v = {1, 2, 3};
std::queue<int> q;
std::for_each(v.rbegin(), v.rend(), [amp;q](auto el){ q.push(el); });