交换堆栈上的两个值
Swap two values on a stack
我想交换 std::stack<double>
顶部的两个值。有没有比以下方法更好的方法?
void swap_top(std::stack<double>& stack)
{
double a = stack.top();
stack.pop();
double b = stack.top();
stack.pop();
stack.push(a);
stack.push(b);
}
这几乎是标准的做法,将 "complex" 代码隔离到一个函数中,这样您就再也不用担心了。当然,作为模板函数会更好,这样它就不会绑定到 double
类型的堆栈。
或者,您可以子class 堆栈(真正的 is-a
子class 或 has-a
变体)并提供该功能作为额外功能。但是你 仍然 必须编写代码 以及 sub-classing 所需的所有代码:-)
你可以用更少的堆栈操作来做到这一点,但使用 std::swap
,虽然我怀疑它会更快:
double a = stack.top();
stack.pop();
std::swap(a, stack.top());
stack.push(a);
或者干脆不使用stack
,直接使用底层容器(如deque
、vector
或list
)。
不知道是不是更好的方法,但至少是另一种方法
void swap_top(std::stack<double>& stack)
{
double a = stack.top();
stack.pop();
swap( a, stack.top() );
stack.push(a);
}
使用普通堆栈,没有更好的方法。
有趣的是,stack
适配器实际上将底层容器公开为受保护的成员。这意味着您可以这样做:
template <typename T, typename Container = std::deque<T>>
class stack_ex : public std::stack<T, Container> {
public:
using stack_ex::stack::stack;
void swap_top() {
auto last = c.rbegin();
auto before_last = std::prev(last);
std::iter_swap(last, before_last);
}
};
不,我会解释原因。
假设有一堆盘子,您只能看到最上面的那个。如果您要卸下顶板,则唯一可以接触到从顶部数第二个板的方法。现在考虑您已经移除了顶板。之前从顶部数第二个的盘子现在位于顶部。你如何修改这个盘子而不先从堆栈中提取它?这是不可能的,所以你提取它。在这一点上,交换元素的最快方法是简单地将它们放回原位,但顺序与提取它们的顺序相反。这就是你所拥有的。
你可以拿一个队列来做。
堆栈:
50
40
30
20
10
弹出前两个元素并插入队列中->->
Queue: 50 40 <- deueue 50 and 40 and oush to the stack 然后你会得到
堆栈
40
50
30
20
10
我想交换 std::stack<double>
顶部的两个值。有没有比以下方法更好的方法?
void swap_top(std::stack<double>& stack)
{
double a = stack.top();
stack.pop();
double b = stack.top();
stack.pop();
stack.push(a);
stack.push(b);
}
这几乎是标准的做法,将 "complex" 代码隔离到一个函数中,这样您就再也不用担心了。当然,作为模板函数会更好,这样它就不会绑定到 double
类型的堆栈。
或者,您可以子class 堆栈(真正的 is-a
子class 或 has-a
变体)并提供该功能作为额外功能。但是你 仍然 必须编写代码 以及 sub-classing 所需的所有代码:-)
你可以用更少的堆栈操作来做到这一点,但使用 std::swap
,虽然我怀疑它会更快:
double a = stack.top();
stack.pop();
std::swap(a, stack.top());
stack.push(a);
或者干脆不使用stack
,直接使用底层容器(如deque
、vector
或list
)。
不知道是不是更好的方法,但至少是另一种方法
void swap_top(std::stack<double>& stack)
{
double a = stack.top();
stack.pop();
swap( a, stack.top() );
stack.push(a);
}
使用普通堆栈,没有更好的方法。
有趣的是,stack
适配器实际上将底层容器公开为受保护的成员。这意味着您可以这样做:
template <typename T, typename Container = std::deque<T>>
class stack_ex : public std::stack<T, Container> {
public:
using stack_ex::stack::stack;
void swap_top() {
auto last = c.rbegin();
auto before_last = std::prev(last);
std::iter_swap(last, before_last);
}
};
不,我会解释原因。
假设有一堆盘子,您只能看到最上面的那个。如果您要卸下顶板,则唯一可以接触到从顶部数第二个板的方法。现在考虑您已经移除了顶板。之前从顶部数第二个的盘子现在位于顶部。你如何修改这个盘子而不先从堆栈中提取它?这是不可能的,所以你提取它。在这一点上,交换元素的最快方法是简单地将它们放回原位,但顺序与提取它们的顺序相反。这就是你所拥有的。
你可以拿一个队列来做。
堆栈: 50 40 30 20 10
弹出前两个元素并插入队列中->->
Queue: 50 40 <- deueue 50 and 40 and oush to the stack 然后你会得到
堆栈 40 50 30 20 10