![](/img/trans.png)
[英]Is there any complexity difference between a std::vector used as a stack and a std::stack?
[英]Is there a difference between std::stack::push() and std::stack::emplace() in this case?
看看這段代碼:
struct Dummy
{
int bla;
int blabla;
char character;
Dummy (int b, int bb, char c)
: bla(b), blabla(bb), character(c)
{}
};
std::stack<Dummy> s;
Dummy dummy;
s.push(dummy); // (1)
s.emplace(dummy); // (2)
我沒有看到(1)
和(2)
之間的區別。 我知道當你為要添加的對象的構造函數提供參數時, emplace()
很有用,例如:
s.emplace(1, 2, 'c');
但是我不知道在我描述的情況下有什么不同,因為push()
和emplace()
應該引用本地dummy
對象並使用copy ctor或類似的東西創建一個新對象。 push()
是否在進程中創建任何臨時對象?
沒有臨時的人。 對於標准, push
看起來像:
void push(const value_type& x) { c.push_back(x); }
void push(value_type&& x) { c.push_back(std::move(x)); }
雖然emplace
看起來像:
template <class... Args>
void emplace(Args&&... args) {
c.emplace_back(std::forward<Args>(args)...);
}
其中c
是底層容器,默認為deque<T>
。 所以在前一種情況下,當你調用push時,你正在調用push(const Dummy&)
,它將通過Dummy(const Dummy&)
創建一個新對象。 在后一種情況下,您正在調用emplace_back(Dummy&)
,它通過Dummy(Dummy&)
直接創建一個新對象。
在您的情況下 - 這兩個副本構造函數之間沒有區別。 它們都會調用由編譯器隱式創建的普通復制構造函數。 因此,您應該看到(1)
和(2)
調用之間沒有行為差異。
如果一個或另一個構造函數不存在(在這種情況下,一個或另一個不會編譯),或者如果它們做了不同的事情,那么只會有區別。
而不是采用value_type emplace采用可變參數列表,這意味着您現在可以完美地轉發參數並直接將對象構造到容器中,而不是臨時的,這可能與涉及臨時性的推動相反。
以下是emplace的標准定義: -
將新元素推送到堆棧頂部。 元素就地構造,即不執行復制或移動操作。 使用與提供給函數完全相同的參數調用元素的構造函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.