在boost :: ptr_vector切片对象上的std :: reverse?

Phi*_*ipp 8 c++ swap std boost-ptr-container

让我们BaseDerived与数据成员的类:

class Base {
public:
    Base(int i):f(i)     { }
    virtual void print() { cout << "base " << f << endl; }
    int f;
};

class Derived: public Base {
public:
    Derived(int i):Base(0),g(i) {  }
    void print() { cout << "derived " << g << endl; }
    int g;
};
Run Code Online (Sandbox Code Playgroud)

现在创建的一些实例Base,并Derived在堆,并将它们存储在boost::ptr_vector:

int main(int argc, char *argv[])
{
    boost::ptr_vector<Base> v;
    v.push_back(new Derived(1));
    v.push_back(new Base(2));
    v.push_back(new Base(3));
    v.push_back(new Derived(4));
Run Code Online (Sandbox Code Playgroud)

打印所有对象:

    for (std::size_t i(0); i != v.size(); ++i)
        v[i].print();
Run Code Online (Sandbox Code Playgroud)

然后反转并重新打印:

    std::reverse(v.begin(), v.end());
    for (std::size_t i(0); i != v.size(); ++i)
        v[i].print();
}
Run Code Online (Sandbox Code Playgroud)

该程序打印:

derived 1
base 2
base 3
derived 4
derived 1
base 3
base 2
derived 4
Run Code Online (Sandbox Code Playgroud)

std::reverse()boost::ptr_vector调用上调用std::iter_swap()哪些调用std::swap通过创建临时副本来交换项目.

但是,临时副本会对Derived对象进行切片.如您所见,对象1和4 int gDerived对象交换,因此交换后对象会被破坏.

这种行为让我很困惑.是不是boost::ptr_vector一个容器,以避免这种问题?

我在这里需要的是一个虚拟拷贝构造函数,它在C++中不存在.

我该如何解决这个问题?我是否需要实现虚拟交换功能Base,以便虚拟调度调用另一个交换成员函数Derived

编辑:为什么首先复制对象?因为向量只存储指针,所以反转它应该是指针的交换,而不是指向的对象!有没有这样做的功能?

Phi*_*ipp 0

一种可能的解决方法是使用

std::reverse(v.base().begin(), v.base().end());
Run Code Online (Sandbox Code Playgroud)

反而。它反转指针而不是自定向迭代器。