c++ - 对数组进行排序并维护元素的旧索引

标签 c++ arrays sorting c++11 structure

我有一个数组A:

A     =   [10 11 3 15 8 7]
index =    0   1 2  3 4 5

我想对这个数组进行排序。排序后我想要旧索引的信息。为此我可以创建一个像这样的结构。

struct VnI{
  int value;
  int index;
};

根据值对结构数组进行排序解决了我的问题。但我想知道是否可以使用 sort 或 C++11 中的任何其他函数来解决这个问题。

我已经尝试过这种方法:

struct VnI{
int V;
int I;
};

bool comparator(VnI x,VnI y){
    if(x.V < y.V)
        return true;
    return false;
}
int maximumGap(const vector<int> &A) {
   vector<VnI> B;
   for(int i = 0;i < A.size();i++){
      B[i].I = i;
      B[i].V = A[i];
}
sort(B.begin(),B.end(),comparator);
for(int i = 0;i < B.size();i++){
    cout<<B[i].I<<" "<<B[i].V<<endl;
  }
}

但是我遇到了运行时错误。 请帮忙。

最佳答案

这段代码是错误的:

vector<VnI> B;  

for(int i = 0;i < A.size();i++){
   B[i].I = i;
   B[i].V = A[i];
}

当您编写 B[i] 时,它假定 B 的大小至少i+1。由于 i 的最大值(您使用了 B 的索引)为 A.size()-1。代码中的假设是 B 的大小至少为 A.size()这个假设是错误的——事实是B的大小为0

不幸的是,std::vectoroperator[] 不会检查超出范围索引。如果使用 at(),代码将抛出 std::out_of_range 异常:

vector<VnI> B;  

for(int i = 0;i < A.size();i++){
   B.at(i).I = i;
   B.at(i).V = A[i];
}

现在这会抛出 std::out_of_range 异常。

无论如何,一个简单的修复可能是这样的:

 vector<VnI> B (A.size());  //initialize B with the size of A.

 for(int i = 0;i < A.size();i++){
    B[i].I = i;
    B[i].V = A[i];
 }

但是,我建议这个解决方案:

 vector<VnI> B;      
 B.reserve(A.size()); 

 for(int i = 0;i < A.size(); i++){
    B.emplace_back(i, A[i]);
 }

我还建议您阅读更多有关 std::vector 的内容。 ,特别是以下功能:

  • 大小()
  • 容量()
  • 调整大小()
  • reserve()
  • push_back()
  • 运算符[]
  • at()
  • emplace_back()
  • 以及所有构造函数。

此外,学会正确命名变量并与其保持一致。

希望有帮助。

关于c++ - 对数组进行排序并维护元素的旧索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31260054/

相关文章:

c - 如何获取用户在 './a.out'之后任意顺序输入的命令行参数整数的GCD?

python - 如何使用 postgresql 在 sqlalchemy 中显式转换数组文字的类型?

javascript - 优化 dom-heavy JS 排序

C++ 省略返回类型

c++ - 对标志在 makefile 中的工作方式感到困惑

c++ - g++找不到头文件

c - 链表和(字母)冒泡排序

c++ - 使用大数据集加速 postgresql 查询

c# - 调试时有效,运行时失败?

ios - 按键将字典数组排序为 Int