矢量排序和更改数据

vector sorting and changing data

本文关键字:数据 排序      更新时间:2023-10-16

我在做这个操作时很吃力,我有一个向量,它的大小可能是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;
}

如果你的问题是按升序对tempID进行排序,我会这样做:

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

看起来您想要做的是返回一个与输入相对应的向量,但每个元素都替换为一个数字,该数字是该元素在输入中出现的相对顺序
也就是说,如果我们从输入中删除了所有重复项,那么每个元素的输出就是该元素在无重复向量中的索引。

这可能会奏效:

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