Я изучал очереди и стеки и в качестве упражнения пытаюсь реализовать их, используя другой (стек с очередью и очередь со стеком). Это можно сделать, используя одну очередь или один стек, но сейчас я делаю это с двумя. При создании функции push(), поскольку существует 2 очереди/стека, после каждого использования одна из очереди/стека заполняется, а другая – нет. (пример: в первом push() q1 пуст, q2 заполняется в следующем push(), q1 заполняется, q2 пуст) В конце функции push() мне нужно поменять их местами, чтобы я всегда мог использовать одну и ту же очередь/стек для других операций.
Меня интересует, что если я использую функцию std::swap(), копирует ли она каждый элемент для замены очереди/стека или просто меняет местами адреса.
На данный момент я просто использовал указатели p1 и p2 и менял их значения, но при этом мне приходится продолжать использовать указанные указатели во всем коде, как показано ниже. Я задаю этот вопрос, потому что, если функция std::swap() меняет адреса, я могу просто использовать это и не заморачиваться с указателями.
Код: Выделить всё
private:
queue q1, q2;
queue* p1 = &q1;
queue* p2 = &q2;
public:
MyStack() {
//constructor
}
void push(int x) {
(*p2).push(x);
while(!(*p1).empty())
{
(*p2).push((*p1).front());
(*p1).pop();
}
//swap
queue* temp = p1;
p1 = p2;
p2 = temp;
}
Это небольшое упражнение, поэтому наличие указателей повсюду — лишь незначительное неудобство, но в более крупном проекте я могу сэкономить время, используя std::swap() вместо использования такого количества указателей или реализации моя собственная функция подкачки, если она меняет адреса вместо самих элементов.
Подробнее здесь:
https://stackoverflow.com/questions/783 ... e-addresse