首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将常数unique_ptr设为const向量

将常数unique_ptr设为const向量
EN

Stack Overflow用户
提问于 2018-04-13 08:45:11
回答 1查看 772关注 0票数 3

我想要创建一个整数向量。一旦创建,我想要洗牌整数,以便有一个随机的整数序。这将用于测试排序函数。

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

Q1。我们如何实现这一目标。

目前的解决办法:

在阅读了以及其他参考资料之后,我做了以下工作。

我正在创建一个向量,将其分配给唯一的指针,以确保它不受内存泄漏的保护,并在超出作用域时被自动删除。我们对向量进行洗牌,然后将该向量移动到一个具有as (const std::vector<int>)类型的新向量中。然后,我们将指针移动到const唯一指针。

在下面的代码中,我对当前的解决方案进行了编码。如果有更好的方法,请告诉我。

我正在使用c++17编译程序。

代码语言:javascript
运行
复制
#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;
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-13 09:42:45

下面是在没有原始指针、没有不必要的unique_ptr使用和没有std::move的情况下编写它的方法

代码语言:javascript
运行
复制
#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函数的参数,我们在这里显式地请求它。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49812804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档