我有一些喜欢这样:
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()的末尾。右边指向nodeList的开头;
现在问题在于,nodeList [i] .left和nodeList [i] .right仅指向其先前邻居的地址,但不一定指向实际的邻居对象。因此,如果我要对nodeList进行排序,则左右指针将不再指向原始节点。相反,他们会指向新的左右邻居。希望问题是清楚的,我怎么能拥有它,以便例如nodeList [1] .left指向nodeList [0],即使nodeList [0]被移动到另一个位置?
答案 0 :(得分:1)
你可以做一个
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;
}