2012-11-20 69 views
0

我有一些像這樣:如何指向實際元素不僅僅是數組地址?

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]; 

注意節點列表[0]。左指向節點列表和nodeList.back()正確的點,對節點列表的開始的結束。

現在這裏是問題,nodeList [i] .left和nodeList [i] .right只指向其先前鄰居的地址,但不一定指向實際的鄰居對象。因此,如果我要對nodeList進行排序,則左側和右側指針不會再指向原始節點。相反,他們會指向新的左右鄰居。希望問題很清楚,我怎麼能夠讓nodeList [1] .left指向nodeList [0],即使nodeList [0]移動到了不同的地方?

+2

你可以把它的節點指針的向量來代替。 –

+0

這是我最初的想法,但想知道我能否避免這種情況。 – dchhetri

+0

如果使用std :: sort,則不會移動內存中的節點,而是複製它們。 –

回答

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; 
} 
相關問題