【发布时间】:2018-09-17 22:30:52
【问题描述】:
我有几个并行数组。我不想创建一个将它们全部组合在一起的新数组,所以我创建了一个索引数组,我想根据其中一个并行数组内容对其进行排序。但是,如果我尝试获取传递索引的索引,它们似乎不是对原始向量的引用。
例如:
#include <iostream>
#include <vector>
#include <algorithm>
#include <assert.h>
using namespace std;
int main()
{
vector<int> original = { 4, 3, 5, 2, 7 };
vector<size_t> indices;
size_t length = original.size();
indices.reserve(length);
for(size_t i = 0; i < original.size(); ++i) {
indices.push_back(i);
}
sort(indices.begin(), indices.end()
, [&] (size_t& lhs, size_t& rhs) {
assert(&indices.front() <= &lhs && &lhs <= &indices.back());
assert(&indices.front() <= &rhs && &rhs <= &indices.back());
size_t iLhs = &lhs - &indices.front();
size_t iRhs = &rhs - &indices.front();
return original[iLhs] < original[iRhs];
});
for(auto index : indices) {
cout << original[index] << endl;
}
return 0;
}
失败并显示消息:
a.out: main.cpp:22: main()::: 断言 `&indices.front() 为什么会这样?这是否意味着
std::sort在明确告知在谓词中使用引用时会创建对象的副本?这不是效率低吗?
【问题讨论】:
-
@Justin,是的,我以前做过。想确保我得到正确的指示。与问题无关。如果真的需要,我会更改它。
-
&indices.front() <= &lhs你不应该比较指针,而是比较索引的值。 -
std::iota可能有助于构建indices。 -
不要求只在引用范围内的情况下调用比较器。
std::sort在std::sort内的局部变量上调用它是完全有效的。这就是正在发生的事情:coliru.stacked-crooked.com/a/bf7b4d862a8cdab9 -
std::sort不复制任何内容。但是,它可以随意移动元素到局部变量中。
标签: c++ visual-c++ stl c++14 std