我有点困惑有关之间的差异push_back和emplace_back.
void emplace_back(Type&& _Val);
void push_back(const Type& _Val);
void push_back(Type&& _Val);
Run Code Online (Sandbox Code Playgroud)
因为有一个push_back超载采用右值参考我不太明白目的是emplace_back什么?
我发现使用C++ STL方法进行简单的集合操作非常笨重.例如,要找到两组之间的差异:
std::set<int> newUserIds;
set_difference(currentUserIds.begin(), currentUserIds.end(), mPreviousUserIds.begin(), mPreviousUserIds.end(), std::inserter(newUserIds, newUserIds.end()));
std::set<int> missingUserIds;
set_difference(mPreviousUserIds.begin(), mPreviousUserIds.end(), currentUserIds.begin(), currentUserIds.end(), std::inserter(missingUserIds, missingUserIds.end()));
mPreviousUserIds = currentUserIds;
Run Code Online (Sandbox Code Playgroud)
boost是否提供了一组替代类,可以将上面的示例缩小为:
set_type<int> newUserIds = currentUserIds.difference(mPreviousUserIds);
set_type<int> missingUserIds = mPreviousUserIds.difference(currentUserIds);
Run Code Online (Sandbox Code Playgroud)
(类似于Qt中的QSet,它operator-以这种方式覆盖.)
考虑以下:
std::vector<std::unique_ptr<int>> ptrsToInts;
ptrsToInts.emplace_back(new int);
Run Code Online (Sandbox Code Playgroud)
如果在向量中发生重新分配,并且失败(抛出std::bad_alloc),我是"安全"还是会泄漏int?
C++ 11 23.3.6.5 [vector.modifiers]/1说:
如果除了复制构造函数之外抛出异常,则移动构造函数,赋值运算符或移动赋值运算符
T或通过任何InputIterator运算都没有效果.
这似乎表明这是一个潜在的问题.也就是说,如果存在"无效果",则unique_ptr从未构造过,因此delete不会发生依赖于该指针的析构函数行为.(这可能表明emplace_back应该禁止容器的unique_ptrs)
拥有通常的Base - > Derived层次结构,如:
class Fruit { ... };
class Pear : Fruit { ... };
class Tomato : Fruit { ... };
std::vector<Fruit*> m_fruits;
Run Code Online (Sandbox Code Playgroud)
是否有意义(例如:它有更好的性能)使用emplace_back而不是push_back?
std::vector::emplace_back( new Pear() );
std::vector::emplace_back( new Tomato() );
Run Code Online (Sandbox Code Playgroud) 下面的最小工作示例在使用选项 1 或选项 2下的代码时编译,但在使用选项 3 下的代码时不编译。我假设emplace_back()隐式使用/调用move构造函数,那么为什么需要显式move()?跟r-valuevs. 有关系l-value吗?或者这是否与std::unique_ptr需要转让所有权有关?(我对这些概念还是陌生的,尤其是在这种情况下。)
为了完整push_back()起见,除非move()调用,否则选项 4 with也不会编译。
#include <iostream>
#include <vector>
#include <memory>
class Beta {
public:
Beta(int x, int y, int z): mX(x), mY(y), mZ(z) { };
int mX; int mY; int mZ;
};
class Alpha {
public:
std::vector<std::unique_ptr<Beta>> betaVec;
void addBeta(int x, int y, int z) {
// only choose one of the following options:
// option …Run Code Online (Sandbox Code Playgroud) 我想知道你是否可以使用emplace_back将项目存储到一个向量中,这是一种从向量所期望的类派生的类型.
例如:
struct fruit
{
std::string name;
std::string color;
};
struct apple : fruit
{
apple() : fruit("Apple", "Red") { }
};
Run Code Online (Sandbox Code Playgroud)
别的地方:
std::vector<fruit> fruits;
Run Code Online (Sandbox Code Playgroud)
我想在向量中存储apple类型的对象.这可能吗?