C++ Boost::ptr_向量改变元素顺序

C++ Boost::ptr_向量改变元素顺序,c++,boost,C++,Boost,请问,有人能告诉我如何在没有 新的动态内存分配。也就是说,我想使用std::vector,但使用boost::ptr_vector,执行与下面相同的操作 void switch( vector<int>& V , size_t i , size_t j){ int a = V[ j ]; V[ j ] = V[ i ]; V[ i ] = a; } 此外,这必须使用索引,而不是ptr\u vector::iterator void switch(

请问,有人能告诉我如何在没有 新的动态内存分配。也就是说,我想使用
std::vector
,但使用
boost::ptr_vector
,执行与下面相同的操作

void switch( vector<int>& V , size_t i , size_t j){
    int a  = V[ j ];
    V[ j ] = V[ i ];
    V[ i ] = a;
}
此外,这必须使用索引,而不是
ptr\u vector::iterator

void switch( vector<int>& V , size_t i , size_t j){
    int a  = V[ j ];
    V[ j ] = V[ i ];
    V[ i ] = a;
}
void开关(向量&V、大小i、大小j){
int a=V[j];
V[j]=V[i];
V[i]=a;
}
谢谢大家。

(未经测试),我想应该是这样的:

void switch( ptr_vector<int>& V , size_t i , size_t j){
  auto p = V.replace(i, nullptr); // should get you the value there..
  auto k = V.replace(j, p);       // should get you the value there..
  auto res = V.replace(i, k);
  assert(res == nullptr); // this should be the case...
}
void开关(ptr\u向量&V、大小i、大小j){
auto p=V.replace(i,nullptr);//应该在那里得到值。。
auto k=V.replace(j,p);//应该在那里得到值。。
自动恢复=V.replace(i,k);
assert(res==nullptr);//应该是这样的。。。
}

您只需交换元素值即可:

using std::swap;
swap(v[1], v[2]);
这将完全满足您对std::vector案例的期望。下面是一个使用sentinel类型跟踪分配的演示:(它不为交换执行任何新分配)

印刷品:

static void* X::operator new(size_t)(4)
X::X(int)(1)
static void* X::operator new(size_t)(4)
X::X(int)(2)
static void* X::operator new(size_t)(4)
X::X(int)(3)
static void* X::operator new(size_t)(4)
X::X(int)(4)
X[1] X[2] X[3] X[4] 
===============================
swapping v[1] and v[2]:
X::X(X&&)(X[2])
X& X::operator=(X&&)(X[3])
X& X::operator=(X&&)(X[2])
X::~X()

===============================
X[1] X[3] X[2] X[4] X::~X()
static void X::operator delete(void*)
X::~X()
static void X::operator delete(void*)
X::~X()
static void X::operator delete(void*)
X::~X()
static void X::operator delete(void*)
完整程序
#包括
结构X{
X(inti):_i(i){std::cout
boost::ptr_向量v;
大小i=任意,j=任意;
//把它放在一个单独的函数中
//不要将其用作子表达式,否则可能会(?)丧失异常安全性
v、 替换(j,v.replace(i,&v[j]).release()).release();

不要调用它
switch
@Mehrdad如何,使其正确?
在抛出“boost::bad_pointer”what():replace()中的Null pointer实例后终止调用。
@sehe:我会优先选择我认为有用的东西(如按钮所示)。如果回答是“未测试”,我也不会失眠恰巧出现了一个错误。如果你发现一个问题的答案让你感到困扰,那么你自己解决它而不是告诉我怎么样?@Mehrdad说,那个抽出时间告诉我你对这个问题提出了不同的解释的人。这不是“未经测试的”。由于
ptr\u vector
的设计,它无法工作。相信我,如果我不必回答您的投诉,我会阅读文档。哇-我错过了所有的乐趣…我保留了原始版本(不合适的名称和函数语义…),我应该看到
nullptr
的东西(现在我看了一下,它就在文档中…@Mehrdad我知道你的意思是什么。但是,这个问题中没有提到这一点。(OP甚至明确提到了
std::vector
示例,该示例已全部给出。)我不明白。如果你明白问题的重点,那你为什么不解决它呢?@Mehrdad我确实理解这个问题。我只是认为你认为重要的一点(因为你知道你和我一样,会用
ptr\u vector
做什么)这不是OP担心的问题。仔细阅读这个问题。顺便问一下,我们可以等待OP的回答吗?现在这是一个解决方案。+1只针对OP:这是/不/等同于
std::vector
方法。不过,这相当于
std::vector
方法。
boost::ptr_vector<T> v;
size_t i = whatever, j = whatever;

// Put this in a separate function
// Do NOT use it as a subexpression or you may (?) forfeit exception safety
v.replace(j, v.replace(i, &v[j]).release()).release();