相关疑难解决方法(0)

push_back vs emplace_back

我有点困惑有关之间的差异push_backemplace_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 visual-studio-2010 move-semantics c++11

684
推荐指数
7
解决办法
29万
查看次数

boost是否具有比STL更简单的set操作的数据类型?

我发现使用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-以这种方式覆盖.)

c++ boost stl set

26
推荐指数
2
解决办法
3964
查看次数

将emplace_back与unique_ptrs容器一起使用是否安全?

考虑以下:

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)

c++ exception-safety emplace

20
推荐指数
1
解决办法
5302
查看次数

我应该使用带有指针包含的C++ 11\templace_back吗?

拥有通常的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)

c++ smart-pointers c++11

19
推荐指数
2
解决办法
2万
查看次数

为什么在这个例子中需要使用 emplace_back 移动?

下面的最小工作示例在使用选项 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)

c++ vector unique-ptr move-semantics emplace

6
推荐指数
1
解决办法
2143
查看次数

emplace_back和继承

我想知道你是否可以使用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类型的对象.这可能吗?

c++ inheritance vector c++11

4
推荐指数
1
解决办法
1696
查看次数