-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 回答