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::coutboost::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();