【发布时间】:2020-01-12 12:19:34
【问题描述】:
我有一个函数需要对给定的元素进行排序。原始向量不得更改,因此我需要向量的浅表副本。 由于我不需要复制元素本身,因为它们只是被读取的,所以我决定制作一个指针向量。 目前我有一个简单的循环填充向量,但我想知道是否存在甚至可能更快的内置/标准解决方案。
void calcFindMinLeftAndSort(std::vector<Location>& locationsComplete, std::vector<Location*>& locationsSorted) {
// ...
// copy data in new array, to keep the original untouched
locationsSorted.reserve(locationsComplete.size());
// looking for locationsSorted.assign(&elements)
// yes, I could use for each instead
for (size_t i = 0; i < locationsComplete.size(); i++)
locationsSorted.emplace_back(&locationsComplete[i]);
// sort
std::sort(locationsSorted.begin(), locationsSorted.end(), compare);
}
附加信息: locationsComplete 向量按特定顺序排序,不得更改。该向量在应用程序运行期间永远不会更改。 排序后的位置排序向量被另一个函数消耗一次(可以在同一个函数中使用,但那样看起来更清晰)。在返回下一个函数的结果后,locationSorted 向量将被淘汰。因此,它可以被视为一个非常短暂的临时向量。
【问题讨论】:
-
使用该解决方案,您需要注意对原始容器进行任何导致其大小调整的操作都会使第二个(已排序)容器中的指针无效。
-
与存储指针相比,存储排序索引会更紧凑