2013-02-20 72 views
-2

我在做這個操作很掙扎,我有一個矢量,它的大小可能是200000,它包含的數據如(156,256,789,1,2,1,1,1,63,89,7,8,45,1,1,2,5,8,9,6,47,8,96,5,465,6,etc)矢量排序和更改數據

我的問題是我想獲取數據爲
(0,1,2,3,4,3,3,3,5,6,7,8,9,3,3,4,10,8,11,etc)

我需要以快速和有效的方式做這個操作..給一些相同的建議。

我的代碼是

vector<int>* VectorReader::SortID(vector<int>* tempID) 
{ 
std::vector<int>::iterator new_sortit; 
vector<int> newit_ID; 
newit_ID.resize(tempID->size()); 
copy(tempID->begin(), tempID->end(), newit_ID.begin()); 
int i = 0; 
for(new_sortit =tempID->begin(); new_sortit != tempID->end(), i < tempID->size(); new_sortit++) 
{ 
    int min_ID = *min_element(tempID->begin(), tempID->end()); 
    int max_ID = *max_element(tempID->begin(), tempID->end()); 
    int search_NodeID = std::find (tempID->begin(), tempID->end(), min_ID) - tempID->begin(); 
    replace(newit_ID.begin()+search_NodeID, newit_ID.end(), min_ID, i); 
    max_ID++; 
    replace(tempID->begin(), tempID->end(), min_ID, max_ID); 
    i++; 
} 
copy(newit_ID.begin(), newit_ID.end(), tempID->begin()); 
return tempID; 
} 
+5

從我不明白的目標是什麼的介紹。您輸出的示例輸出沒有排序......正在整理您想要的內容或其他內容? – jogojapan 2013-02-20 04:31:00

+3

我覺得你只需要一個std :: sort來替換你的代碼的函數。或者我完全誤解你的問題? – billz 2013-02-20 04:31:27

回答

0

它看起來像你想什麼do是返回一個與輸入相對應的向量,但每個元素都被一個數字替換,該數字就是該元素在輸入中出現的相對順序。
也就是說,如果我們從輸入中刪除了所有重複項,則每個元素的輸出都是該複製向量中該元素的索引。

這可能做的伎倆:

#include <vector> 
#include <map> 

typedef std::vector<int> Ints; 
typedef std::map<int, size_t> IndexTable; 

Ints findIndices(const Ints& input) 
{ 
    size_t size = input.size(); 
    IndexTable indices; 
    size_t index = 0; 
    for (size_t i = 0; i != size; ++i) 
    { 
     if (indices.find(input[i]) == indices.end()) 
     { 
     indices[input[i]] = index; 
     ++index; 
     } 
    } 
    Ints output(size); 
    for (size_t i = 0; i != size; ++i) 
    { 
     output[i] = indices[input[i]]; 
    } 
    return output; 
} 
+0

@ user2089677是的,一個例子。我對你的意圖的猜測是基於這個例子。如果不對,請澄清輸入和輸出之間的關係。這(主要)不是心理網絡。 – molbdnilo 2013-02-21 08:20:55

+0

是的,它運作良好,我需要一些改變,我已經舉了一個我需要的例子?我的向量有像vector1 = [56,78,2,4,1,56,9,11,56]元素。是否可以得到輸出爲[5,6,1,2,0,5,3,4,5]。 – user2089677 2013-02-21 13:09:37

+0

@ user2089677這看起來不像你最初問的那樣。您必須更好地描述*任意*輸入的問題。 – molbdnilo 2013-02-21 13:25:36

2

如果你的問題是升序排列tempID,我會做這樣的:

vector<int> VectorReader::SortID(vector<int> tempID) 
{ 
    std::sort(tempID.begin(), tempID.end()); 
    return tempID; 
}