Boost Intrusive Swap
Boost Intrusive Swap
我有一个声明为class MyClass : public list_base_hook<link_mode<normal_link>>
的类。我还有一个声明为list<MyClass> global_list_MyClass
的列表。
我使用for循环将10个节点插入到global_list_MyClass
中。我的目标是尝试使用boost::intrusive::swap
交换Node1
和Node2
,但似乎失败了(有很多编译错误)。
我试着在网上搜索,但找不到任何好的例子。
示例代码:
class MyClass : public list_base_hook<link_mode<normal_link>>
{
public:
int nValue;
public:
MyClass(){}
virtual ~MyClass(){}
};
static boost::intrusive::list<MyClass> global_list_MyClass;
//Insert 10 nodes
for (int n=0; n<10; n++)
{
MyClass *p_oTMP1 = new MyClass();
p_oTMP1->nValue = n;
global_list_MyClass.push_back(*p_oTMP1);
}
//Search for Target node 1
int nTarget1 = 5;
boost::intrusive::list<MyClass>::iterator oTmpTarget1;
for (list<MyClass>::iterator iTmpToken=global_list_MyClass.begin(); iTmpToken!=global_list_MyClass.end(); iTmpToken++)
{
if (!(iTmpToken->nValue == nTarget1))
continue;
oTmpTarget1 = iTmpToken;
break;
}
//Search for Target node 2
int nTarget2 = 6;
boost::intrusive::list<MyClass>::iterator oTmpTarget2;
for (list<MyClass>::iterator iTmpToken=global_list_MyClass.begin(); iTmpToken!=global_list_MyClass.end(); iTmpToken++)
{
if (!(iTmpToken->nValue == nTarget2))
continue;
oTmpTarget2 = iTmpToken;
break;
}
//Swap Node1 with Node2
/*Here is what i not sure what to do with boost::intrusive::swap or global_list_MyClass.swap()
我认为您不能在这里使用swap()
——这是用于交换容器,而不是容器中的节点。您可以移除元素并将其重新插入交换的位置,不过:
void swapItems(boost::intrusive::list<MyClass> &list, boost::intrusive::list<MyClass>::iterator it1, boost::intrusive::list<MyClass>::iterator it2)
{
if (it1 == it2) return;
MyClass &node1 = *it1;
MyClass &node2 = *it2;
it1 = list.erase(it1);
if (it1 == it2) { //1 was immediately followed by 2
list.insert(++it2, node1);
return;
}
it2 = list.erase(it2);
list.insert(it2, node1);
list.insert(it1, *node2);
}
当然,根据MyClass
编写这个函数几乎是荒谬的——它最好作为一个函数模板来处理任意类。它甚至可以按容器类型进行模板化,但在迭代器失效方面必须更加小心。
另一种选择是在类anc调用中提供类似swapValues()
的函数:
void MyClass:swapValues(MyClass &other)
{
using std::swap;
swap(nValue, other.nvalue);
//dtto for other members, but NOT for the boost::intrusive linking structure
}
相关文章:
- 是否可以在 C++03 中定义'move-and-swap idiom'等效项
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- 我可以使用 std::vector::swap 来修改共享向量吗?
- Valgrind 在 std::string::swap 中报告 SIGILL
- 对函数的 out 字符串参数使用 swap 与赋值
- 使用 std::vector::swap 方法在C++中交换两个不同的向量是否安全?
- a,b = b,a in python vs std::swap() in C++
- 使用 std::swap 禁用 ADL
- 如何使用 std::swap with array?
- 为什么 std::swap 不适用于<bool> Clang/Win(英语:Clang/Win)下的矢量元素?
- swap(int&, int&) 函数不起作用,当交换不使用临时变量时?
- 智能指针的 std::swap 是否保证引用保持不变?
- 如果我在整个班级上使用std ::交换,则会使用专门的shared_ptr :: swap()函数
- 为什么我的自定义"::swap"函数没有被调用?
- 为什么要将 swap() 实现为非抛出
- 为什么使用 Boost.Intrusive 容器来存储多态对象是可以的?
- 在共享指针的值中调用 std::swap 调用一堆构造函数和析构函数
- "std::swap"应用于这些对象时会做什么?
- 是否使用示波器队列:: swap违反任何规则来清空std ::队列
- Boost Intrusive Swap