Мой вектор хранит номера вершин некоторого графа в порядке возрастания. Я хочу добавить эти числа в очередь, чтобы позже запустить 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()
один?
Я знал и раньше, что существуют rbegin и rend, и я не мог понять, почему люди не используют обычные begin() и end(), но с переставленными местами в коде, но точно знаю, прочитав его еще раз по вашей ссылке, я нашел наш этот end() и rbegin() указывает на разные места в памяти, спасибо, чувак!
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(), [&q](auto el){ q.push(el); });
Используйте стандартный:: rbegin и
std::rend