Повысить навязчивый своп

У меня класс объявлен как class MyClass : public list_base_hook<link_mode<normal_link>>, У меня также есть список, объявленный как list<MyClass> global_list_MyClass,

Я вставляю 10 узлов в global_list_MyClass используя цикл. Моя цель — попытаться обменяться Node1 а также Node2 с помощью boost::intrusive::swap но, похоже, не удалось (много ошибок компиляции).

Я пытался искать в Интернете, но не могу найти хороший пример для этого.

Пример кода:

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()

1

Решение

Я не думаю, что вы можете использовать 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 почти абсурдно — было бы гораздо лучше использовать в качестве шаблона функции для работы с произвольным классом. Возможно, он даже может быть основан на типе контейнера, но вам нужно быть более осторожным в отношении аннулирования итератора.

Альтернативой было бы предоставить что-то вроде swapValues() функция в вашем классе anc call, которая:

void MyClass:swapValues(MyClass &other)
{
using std::swap;
swap(nValue, other.nvalue);
//dtto for other members, but NOT for the boost::intrusive linking structure
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]