- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个复杂的类,它包含一大块 double[2]
- 由智能指针管理的类型数据,例如:std::unique_ptr<double[2]> m_data;
我无法更改数据结构的类型。
我正在使用一个库,它为我提供了一个具有以下签名的函数:bool
.我无法更改此函数的签名。
func_in_lib(std::vector<double>& data, double& res)
我想传递 unique_ptr
管理的数据到期望 vector<double>&
的函数在不中断与我的复杂类(class)的联系的情况下。我希望该功能直接在我的 m_data
上工作而不是将数据复制到 std::vector<double>
并将其复制回我的复杂类,因为我必须这样做很多次。
有没有办法做到这一点?
这是一些涵盖我想要的语义的代码。我关心的代码行是vector<double> access_vec = /* give access to my_data via vector interface */;
#include <iostream>
#include <memory>
#include <vector>
using namespace std;
//--------------------------------------------------------------------------//
//--- This function is given, I cannot change its signature.
bool
func_in_lib(std::vector<double>& data, double& res) {
//--- check some properties of the vector
if (data.size() < 10)
return false;
//--- do something magical with the data
for (auto& d : data)
d *= 2.0;
res = 42.0;
return true;
}
//--------------------------------------------------------------------------//
struct DataType {
double a = 1.0;
double b = 2.0;
double c = 3.0;
};
//--------------------------------------------------------------------------//
ostream&
operator<<(ostream& out, const DataType& d) {
out << d.a << " " << d.b << " " << d.c << endl;
return out;
}
//--------------------------------------------------------------------------//
int
main(int argc, char const* argv[]) {
int count = 20;
//--- init and print my data
unique_ptr<DataType[]> my_data = make_unique<DataType[]>(count);
for (int i = 0; i < count; ++i)
cout << my_data.get()[i];
//---
double result = 0.0;
vector<double> access_vec = /* give access to my_data via vector interface */;
func_in_lib(access_vec, result);
return 0;
}
最佳答案
tl; dr:不可能以符合标准的方式。
这实际上几乎是可能的,但是 std::allocator
限制挡住了你的去路。让我解释。
std::vector
“拥有”它用于元素存储的内存: vector 有权 delete[]
内存(例如,在销毁时,或在移动后销毁,或 .resize()
或 push_back
等)并在其他地方重新分配。如果您想保留 unique_ptr
的所有权,你不能允许这种情况发生。虽然你的 func_in_lib()
的模拟实现是真的没有做任何事情 - 你的代码不能做出这些假设,因为它必须迎合函数的声明,而不是它的主体。 func_in_lib()
返回,然后要么修复 unique_ptr 中的内容,要么抛出异常(取决于代码中的其他位置是否包含指向废弃内存的指针)。或者——假设
func_in_lib()
拍了
const std::vector<double[2]>&
而不是非常量引用。我们的路还是会被堵死。为什么?
std::vector
通过分配器对象管理内存。分配器是一个模板,所以理论上你可以使用一个 vector ,分配器可以做任何你想做的事情 - 例如,从预先分配的内存(你给它 - 从 unique_ptr::get()
开始,并拒绝重新分配任何内存,例如,通过抛出异常。由于 std::vector
构造函数之一采用适当类型的分配器 - 您可以构造所需的分配器,用它创建一个 vector ,然后传递对该 vector 的引用。func_in_lib
没有模板化,只能为其分配器采用默认模板参数:
std::allocator
.
std::vector
使用的默认分配器和其他标准库容器是 std::allocator
.现在,在我看来,分配器通常是一个错误的想法。但是 std::allocator
特别烦人。具体来说,它不能使用预先存在的内存区域来构建它以供它使用;它只保存它自己分配的内存——从不保存你给它的内存。 std::vector
使用你想要的内存。
std::vector
的具体布局在您的系统上reinterpret_cast<std::vector>()
在您的原始数据上。 malloc()
和 free()
钩子(Hook)(如果您在类 Unix 系统上和/或使用使用 libc 的编译器)new[]
来自 std::vector
的电话你创造,并给它你自己的unique_ptr
-控制内存而不是实际分配任何东西。当 vector 要求释放内存时(例如在销毁时),你什么也不做。 func_in_lib
写得不好。除非它是一个非常利基的库,否则我相信会有更好的选择。事实上,你可以更好地自己编写它。 func_in_lib()
使用那些。并不总是可行的,但可能值得做空。 关于c++ - 使用 std::vector<double> 访问由 std::unique_ptr<double[2]> 管理的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62467215/
初学者 android 问题。好的,我已经成功写入文件。例如。 //获取文件名 String filename = getResources().getString(R.string.filename
我已经将相同的图像保存到/data/data/mypackage/img/中,现在我想显示这个全屏,我曾尝试使用 ACTION_VIEW 来显示 android 标准程序,但它不是从/data/dat
我正在使用Xcode 9,Swift 4。 我正在尝试使用以下代码从URL在ImageView中显示图像: func getImageFromUrl(sourceUrl: String) -> UII
我的 Ubuntu 安装 genymotion 有问题。主要是我无法调试我的数据库,因为通过 eclipse 中的 DBMS 和 shell 中的 adb 我无法查看/data/文件夹的内容。没有显示
我正在尝试用 PHP 发布一些 JSON 数据。但是出了点问题。 这是我的 html -- {% for x in sets %}
我观察到两种方法的结果不同。为什么是这样?我知道 lm 上发生了什么,但无法弄清楚 tslm 上发生了什么。 > library(forecast) > set.seed(2) > tts lm(t
我不确定为什么会这样!我有一个由 spring data elasticsearch 和 spring data jpa 使用的类,但是当我尝试运行我的应用程序时出现错误。 Error creatin
在 this vega 图表,如果我下载并转换 flare-dependencies.json使用以下 jq 到 csv命令, jq -r '(map(keys) | add | unique) as
我正在提交一个项目,我必须在其中创建一个带有表的 mysql 数据库。一切都在我这边进行,所以我只想检查如何将我所有的压缩文件发送给使用不同计算机的人。基本上,我如何为另一台计算机创建我的数据库文件,
我有一个应用程序可以将文本文件写入内部存储。我想仔细看看我的电脑。 我运行了 Toast.makeText 来显示路径,它说:/数据/数据/我的包 但是当我转到 Android Studio 的 An
我喜欢使用 Genymotion 模拟器以如此出色的速度加载 Android。它有非常好的速度,但仍然有一些不稳定的性能。 如何从 Eclipse 中的文件资源管理器访问 Genymotion 模拟器
我需要更改 Silverlight 中文本框的格式。数据通过 MVVM 绑定(bind)。 例如,有一个 int 属性,我将 1 添加到 setter 中的值并调用 OnPropertyChanged
我想向 Youtube Data API 提出请求,但我不需要访问任何用户信息。我只想浏览公共(public)视频并根据搜索词显示视频。 我可以在未经授权的情况下这样做吗? 最佳答案 YouTube
我已经设置了一个 Twilio 应用程序,我想向人们发送更新,但我不想回复单个文本。我只是想让他们在有问题时打电话。我一切正常,但我想在发送文本时显示传入文本,以确保我不会错过任何问题。我正在使用 p
我有一个带有表单的网站(目前它是纯 HTML,但我们正在切换到 JQuery)。流程是这样的: 接受用户的输入 --- 5 个整数 通过 REST 调用网络服务 在服务器端运行一些计算...并生成一个
假设我们有一个名为 configuration.js 的文件,当我们查看内部时,我们会看到: 'use strict'; var profile = { "project": "%Projec
这部分是对 Previous Question 的扩展我的: 我现在可以从我的 CI Controller 成功返回 JSON 数据,它返回: {"results":[{"id":"1","Sourc
有什么有效的方法可以删除 ios 中 CBL 的所有文档存储?我对此有疑问,或者,如果有人知道如何从本质上使该应用程序像刚刚安装一样,那也会非常有帮助。我们正在努力确保我们的注销实际上将应用程序设置为
我有一个 Rails 应用程序,它与其他 Rails 应用程序通信以进行数据插入。我使用 jQuery $.post 方法进行数据插入。对于插入,我的其他 Rails 应用程序显示 200 OK。但在
我正在为服务于发布请求的 API 调用运行单元测试。我正在传递请求正文,并且必须将响应作为帐户数据返回。但我只收到断言错误 注意:数据是从 Azure 中获取的 spec.js const accou
我是一名优秀的程序员,十分优秀!