#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); });