你可以只讓同時保留訪問原始訂單,只需不大不小的
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;
}
你可以把它的節點指針的向量來代替。 –
這是我最初的想法,但想知道我能否避免這種情況。 – dchhetri
如果使用std :: sort,則不會移動內存中的節點,而是複製它們。 –