我想创建一个整数向量。一旦创建我想要洗牌 整数,以便有一个整数的随机顺序。这将用于测试排序功能。
现在,不允许排序算法就地对矢量进行排序,因此我们需要使矢量恒定。另外 - 我不希望任何人能够更改unique_ptr
并将其指向其他内容。
Q1。我们如何实现它。
当前解决方案:
在阅读this和this以及其他参考资料后,我已完成以下操作。
我正在创建一个向量,将其分配给唯一指针,以确保它防止内存泄漏,并在我们超出范围时自动删除。我们将向量移动,然后将此向量移动到一个类型为(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;
}
}
答案 0 :(得分:3)
以下是如何在没有原始指针的情况下编写它,没有不必要的unique_ptr
用法,没有std::move
:
#include <iostream>
#include <random>
#include <algorithm>
#include <vector>
std::vector<int>
createVector(int numberOfElements, int increments) {
auto v = 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);
return v;
}
auto sortUsingStdSort(std::vector<int> v) {
std::sort(v.begin(), v.end());
return v;
}
int main() {
const std::vector<int> u3 = createVector(10, 5);
auto sortedVector = sortUsingStdSort(u3);
for(auto v : sortedVector) {
std::cout << " " << v;
}
}
向量通过const
引用传递,因此没有不必要的复制。向量按值返回,但我们可以依赖RVO来避免复制。
复制的唯一地方是sortUsingStdSort
函数的参数,我们明确要求它。