【发布时间】:2020-12-21 11:28:41
【问题描述】:
我尝试使用另一个值对一个向量进行排序,
这是代码:
template <typename T>
void ordered_by_old_indices(std::vector<T> const& values, std::vector<size_t> &indices) {
//std::vector<size_t> indices(values.size());
//std::iota(begin(indices), end(indices), static_cast<size_t>(0));
//auto x = indices.begin();
//std::cout << *x << std::endl;
//auto y = indices.end()-1;
//std::cout << *y << std::endl;
std::sort(
indices.begin(), indices.end(),
[&](size_t a, size_t b) { return values[a] < values[b]; }
);
//return indices;
}
但它给了我错误:
vector subscript out of range
这里有什么问题,它只是排序的包装器???
更新: 问题是 sort 给出了要排序的向量元素的比较函数值,我想要一种方法让 sort 传递元素的位置而不是它的值。这意味着传递 01234567.... 但在给定的向量索引上工作
【问题讨论】:
-
“向量下标超出范围”就是这个意思。通常人们将其称为越界访问。现在您需要在调试器中捕获异常,并在异常发生时检查所有相关值。
values似乎比要求的要小。 -
索引和值的大小相同
-
在这种情况下,我会在调用
std::sort()之前插入一个assert(values.size() == indices.size());。如果它导致中止,您就会知道它为什么不起作用。如果它没有任何作用,这至少对读者来说是一个有价值的提示。 -
那你也可以再添加一个:
assert([&]() { for (size_t i : indices) { if (i >= values.size()) return false; } return true; }());(抱歉,单行看起来有点丑) -
我同意@JHBonarius:我的第一个
assert()有点人手不足。第二个检查indices中的所有索引是否指向values中的现有元素。如果失败,indices中至少有一个索引,这可能导致对values的越界访问(如果用于例如values[indices[i]]或用于sort()的自定义谓词中)。