-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;
}
4

2 に答える 2

2

あなたの質問がtempID昇順でソートすることであるならば、私はこれをしたいと思います:

vector<int> VectorReader::SortID(vector<int> tempID)
{
  std::sort(tempID.begin(), tempID.end());
  return tempID;
}
于 2013-02-20T04:39:50.297 に答える
0

入力に対応するベクトルを返すように見えますが、各要素は、その要素が入力で発生した相対的な順序である数値に置き換えられています。
つまり、入力からすべての重複を削除した場合、各要素の出力は、重複のないベクトル内のその要素のインデックスになります。

これでうまくいくかもしれません:

#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;
}
于 2013-02-20T07:17:25.693 に答える