Как указать на фактический элемент, а не только адрес массива?

У меня есть примерно так:

struct Node{
int value;
Node *left, Node *right;
Node(): value(0), left(0), right(0){}
}
std::vector<Node> nodeList = getNodes();

Я хочу, чтобы выше, чтобы сделать круговой буфер. Так

nodeList[i].left = &nodeList[i - 1];
nodeList[i].right= &nodeList[i + 1];

обратите внимание, что nodeList [0] .left указывает на конец nodeList, а nodeList.back (). right указывает на начало в nodeList;

Теперь возникает проблема: nodeList [i] .left и nodeList [i] .right только указывают на адрес своего предыдущего соседа, но не обязательно указывают на фактический соседний объект. Так что, если бы я отсортировал nodeList, левый и правый указатель больше не будут указывать на исходный узел. Вместо этого они будут указывать на нового левого и правого соседа. Надеюсь, что проблема ясна, как я могу это сделать, чтобы, например, nodeList [1] .left указывал на nodeList [0], даже если nodeList [0] был перемещен в другое место?

0

Решение

Вы можете просто сделать

std::vector<int> originalData = getOriginalData();

Затем для сортировки, сохраняя доступ к исходному порядку, просто

std::vector<int const*> itemPointers;

который вы можете инициализировать так:

for( auto&& x : originalData )
{
itemPointers.push_back( &x );
}

Теперь просто сортировка:

std::sort(
itemPointers.begin(), itemPointers.end(),
[]( int const* p1, int const* p2 ) { return (*p1 < *p2); }
);

Полный код, показывающий также детали доступа к исходному элементу предшественника данных:

#include <algorithm>        // std::sort
#include <iostream>
#include <utility>          // std::begin, std:.end
#include <vector>           // std::vector
//using namespace std;std::vector< int > getOriginalData()
{
static int const data[] = {3, 1, 4, 1, 5, 9, 2, 6, 5, 4};
return std::vector<int>( std::begin( data ), std::end( data ) );
}

int main()
{
std::vector<int> const originalData = getOriginalData();

std::vector<int const*> itemPointers;

for( auto const& x : originalData )
{
itemPointers.push_back( &x );
}

std::sort(
itemPointers.begin(), itemPointers.end(),
[]( int const* p1, int const* p2 ) { return (*p1 < *p2); }
);

std::wcout << "Sorted: ";
for( auto const p : itemPointers )
{
std::wcout << *p << " ";
}
std::wcout << std::endl;

std::wcout << "Predecessors in original data: ";
for( auto const p : itemPointers )
{
int const* const pPred = (p == &originalData[0]? nullptr : p - 1);
if( pPred == nullptr )
{ std::wcout << "! "; }
else
{ std::wcout << *pPred << " "; }
}
std::wcout << std::endl;
}
1

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector