gpt4 book ai didi

c++ - 将常量 unique_ptr 设为常量 vector

转载 作者:太空狗 更新时间:2023-10-29 21:11:43 25 4
gpt4 key购买 nike

我想创建一个整数 vector 。创建后我想洗牌整数,以便具有随机顺序的整数。这将用于测试排序功能。

现在,不允许任何排序算法对 vector 进行就地排序,因此我们需要使 vector 成为常量。另外 - 我不希望任何人能够更改 unique_ptr并将其指向其他东西。

Q1。我们如何实现它。

当前解决方案:

看完thisthis和其他引用资料,我做了以下工作。

我正在创建一个 vector ,将其分配给唯一的指针以确保防止内存泄漏并在我们超出范围时自动删除它。我们打乱 vector ,然后将该 vector 移动到一个类型为 ( const std::vector<int>) 的新 vector 。然后我们将指针移动到一个常量唯一指针。

在下面的代码中,我编写了当前解决方案。让我知道是否有更好的方法。

我正在使用 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;
}
}

最佳答案

如果没有原始指针,没有不必要的 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;
}
}

vector 由 const 引用传递,因此没有不必要的复制。 vector 按值返回,但我们可以依赖 RVO以避免在这里复制。

唯一进行复制的地方是 sortUsingStdSort 函数的参数,我们明确请求它。

关于c++ - 将常量 unique_ptr 设为常量 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49812804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com