Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 矢量排序和更改数据_C++_C_Sorting_Vector - Fatal编程技术网

C++ 矢量排序和更改数据

C++ 矢量排序和更改数据,c++,c,sorting,vector,C++,C,Sorting,Vector,我正在努力做这个操作,我有一个向量,它的大小可能是200000,它包含(15656789,1,2,1,1,1,63,89,7,8,45,1,1,2,5,8,9,6,47,8,96,5465,6等)之类的数据 我的问题是我喜欢以 (0,1,2,3,4,3,3,3,5,6,7,8,9,3,3,4,10,8,11等) 我需要以快速有效的方式做这个手术。同样的,给我一些建议 我的代码是 vector*VectorReader::SortID(vector*tempID) { std::vector::i

我正在努力做这个操作,我有一个向量,它的大小可能是
200000
,它包含
(15656789,1,2,1,1,1,63,89,7,8,45,1,1,2,5,8,9,6,47,8,96,5465,6等)之类的数据

我的问题是我喜欢以
(0,1,2,3,4,3,3,3,5,6,7,8,9,3,3,4,10,8,11等)

我需要以快速有效的方式做这个手术。同样的,给我一些建议

我的代码是

vector*VectorReader::SortID(vector*tempID)
{
std::vector::iterator new_sortit;
向量newit_ID;
newit_ID.resize(tempID->size());
复制(tempID->begin(),tempID->end(),newit_ID.begin());
int i=0;
对于(new_sortit=tempID->begin();new_sortit!=tempID->end(),isize();new_sortit++)
{
int min_ID=*min_元素(tempID->begin(),tempID->end());
int max_ID=*max_元素(tempID->begin(),tempID->end());
int search_NodeID=std::find(tempID->begin(),tempID->end(),min_ID)-tempID->begin();
替换(newit_ID.begin()+search_NodeID,newit_ID.end(),min_ID,i);
max_ID++;
替换(临时标识->开始(),临时标识->结束(),最小标识,最大标识);
i++;
}
复制(newit_ID.begin()、newit_ID.end()、tempID->begin());
返回tempID;
}

如果您的问题是按升序排序
tempID
,我会这样做:

vector<int> VectorReader::SortID(vector<int> tempID)
{
  std::sort(tempID.begin(), tempID.end());
  return tempID;
}
向量向量阅读器::SortID(向量tempID) { 排序(tempID.begin(),tempID.end()); 返回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;
}
#包括
#包括
typedef std::向量整数;
typedef std::map IndexTable;
输入findIndices(常量输入和输入)
{
size_t size=input.size();
指数化;
尺寸指数=0;
对于(大小i=0;i!=size;++i)
{
if(index.find(输入[i])==index.end())
{
索引[输入[i]]=索引;
++指数;
}
}
Ints输出(大小);
对于(大小i=0;i!=size;++i)
{
输出[i]=索引[input[i]];
}
返回输出;
}

从描述中,我不明白目标是什么。您给出的示例输出未排序。。。排序是你想要的,还是别的什么?我觉得你只需要一个函数std::sort来代替你的代码。还是我完全误解了你的问题?@user2089677是的,举个例子。我对你意图的猜测是基于这个例子的。如果是错误的,请澄清输入和输出之间的关系。这(大部分)不是心理网络。是的,它工作得很好,我需要一些改变,我已经举了一个例子说明我需要什么?我的向量有像vector1=[56,78,2,4,1,56,9,11,56]这样的元素。有没有可能得到输出为[5,6,1,2,0,5,3,4,5]。@user2089677这看起来一点都不像您最初要求的。您必须对任意输入的问题有更好的描述。
#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;
}