【发布时间】:2018-09-23 13:35:08
【问题描述】:
我想创建一个整数向量。一旦创建,我想洗牌 整数,以便具有随机顺序的整数。这将用于测试排序功能。
现在,不允许任何排序算法对向量进行就地排序,因此我们需要使向量成为常数。另外 - 我不希望任何人能够更改 unique_ptr 并将其指向其他内容。
第一季度。我们如何实现它。
当前解决方案:
我正在创建一个向量,将其分配给唯一指针,以确保它可以防止内存泄漏并在超出范围时自动删除。我们将向量打乱,然后将此向量移动到类型为 (const std::vector<int>) 的新向量。然后我们将指针移动到一个 const 唯一指针。
在下面的代码中,我编写了当前解决方案。让我知道是否有更好的方法。
我正在使用 c++17 来编译程序。
#include <random>
#include <memory>
#include <algorithm>
#include <iostream>
#include <vector>
std::unique_ptr<const std::vector <int>>
createConstVector(int numberOfElements, int increments) {
auto v = std::make_unique <std::vector<int>> (numberOfElements);
std::random_device rd;
std::mt19937 g(rd());
std::generate(v->begin(), v->end(),
[n=0, increments] () mutable { n = n + increments; return n;});
std::shuffle(v->begin(), v->end(), g);
std::unique_ptr<const std::vector<int>> v2 = std::move(v);
return std::move(v2);
}
auto sortUsingStdSort(std::unique_ptr<const std::vector<int>> const &vectorToSort) {
auto v = std::make_unique<std::vector<int>> (*vectorToSort);
std::sort(v->begin(), v->end());
return std::move(v);
}
int main () {
const std::unique_ptr<const std::vector <int>> u3 = createConstVector(10, 5);
auto sortedVector = sortUsingStdSort(u3);
for(auto v : *sortedVector) {
std::cout << " " << v;
}
}
【问题讨论】:
-
为什么不简单地使用
const vector<int>而不是std::unique_ptr<const std::vector <int>>? -
我觉得你想多了。我认为不需要
unique_ptr。 -
我们说:
auto sortUsingStdSort(const std::vector<int>& vectorToSort) { std::vector<int> v = vectorToSort; std::sort(v.begin(), v.end()); return v; }` -
@SaileshD 我很确定第二个链接中的规则的重点是,无论您在哪里接受
const unique_ptr<T>&,您最好只接受T*(或T&),因为无论哪种方式都没有所有权转移,而且后者更灵活。 -
@RishiAgrawal 是的,只需将向量设为自动变量即可。向量已经基本上只是其托管数组的一个 unique_ptr (有一些额外的方法来做向量的东西)。在这种情况下,没有理由动态分配向量本身。
标签: c++ c++11 c++14 c++17 unique-ptr