问题标签 [array-view]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
384 浏览

c++ - C++ 使用给定向量的大小以内存安全的方式创建二维数组

我如何实现以下目标:

首先,我知道我可以做到new但我必须记得稍后删除它,如果可能的话,我宁愿不必处理内存释放。

其次,我不能在堆栈上声明二维数组,因为 N 不是(在这种情况下也不能是)常量表达式。(无论如何我使用的是 VS2013,它不支持constexpr。)

第三,我不能(或者可能不知道如何)使用std::array,因为显然“局部变量不能用作非类型参数”。(我从 VS2013 编译对话中复制粘贴了这个,对这一点知之甚少)。

第四,我正在考虑使用unique_ptr. 问题是,我知道怎么用unique_ptr用于一维数组,例如std::unique_ptr<int> arr{ new int[N] },但不知道如何为二维数组执行此操作。

最后,我知道我总是可以围绕始终在堆上创建的 C 样式数组编写自己的瘦包装器,或者编写自己的 2D 数组类。但是在 C++ (C++11) 中是否有本机或标准库方式来执行此操作?

0 投票
4 回答
6462 浏览

c++ - C++:std::vector - 可以“切片”向量吗?

我正在编写一些代码来集成 ODE。这个问题既是对编码建议的请求,也是对解决方案的请求,因此,如果您对我将要提供的建议有替代建议,请告诉我!

ODE 积分器要集成的“对象”以 6 个“块”的形式出现……原因是我有一个双精度的 std::vector,它们按以下方式排列:

前 3 个双精度值是位置坐标;x、y 和 z。接下来的 3 个双精度是速度坐标;x、y 和 z。

所以,现在你知道了,我有一个函数,它接受成对的“位置” “”“向量”“”作为参数并返回某种结果......看看我要去哪里?

目前,该函数需要 2 批位置坐标,方式如下:

我不想将 3 组中的所有数据复制到新向量中——这是一种疯狂(而且非常慢)的编程方式。

可以改为使用指向原始数据的指针......并且只需将指针传递给 x 坐标(3 个双精度块中的第一项) - 这对我来说似乎还可以,但也许有更好的方法?有点像 Python 或 Matlab 数组切片?我可以做这样的事情吗?

我有点想传递一个新的向量(或某种包装类?),从已经存储在数组中的数据创建......有点像

好的,所以上面的内容是荒谬的,因为可能实现该语法的语言仍然会进行复制操作,这可能很慢 - 这正是我试图避免的......

所以是的,我不确定在这里进行的最佳方式 - 任何人都可以提出一个“好的”解决方案吗?(以非主观方式!)

编辑:要说清楚 - 问题是我不想做类似的事情:

编辑 2:考虑编译器选项 - 编译器是否会通过以下方式更改函数以接受参数来为我优化我的代码:

在这种情况下,也许这个问题并不重要?(除了形成“让你的代码看起来很好读”的观点。)

编辑3:因此它仍然很重要。

0 投票
1 回答
132 浏览

c++ - SFINAE 将任何容器放入 c 样式的数组视图中

我正在制作一个简单的、非拥有的数组视图类:

我想从具有data()size()成员函数的任何容器构造它,但是 SFINAE-d 正确,只有在它是有效且安全的行为才能实际遍历array_view的情况下才能从某个容器构造。Cdata_

我去了:

这似乎完全不令人满意,我什至不确定它是否正确。我是否正确地包括了所有正确的容器并排除了所有错误的容器?有没有更简单的方法来编写这个要求?

0 投票
4 回答
182 浏览

c++ - 相当于 c++ 中向量上的 int[] + k

我有一个算法,我想翻译我的代码,所以我不想使用数组,而是使用向量。

你会怎么翻译这个:(b + j和a的一边)

在哪里

进入

它必须是等价的,所以像这样的调用返回与我使用数组相同的值:

0 投票
7 回答
635 浏览

c++ - 将 std::string 解释为 char_type 的 std::vector?

我有一个template<typename T>需要const vector<T>&. 在所述函数中,我有向量cbegin()cend()size()operator[]。据我了解,两者都string使用vector连续空间,所以我想知道是否可以以优雅的方式重用这两种数据类型的函数。

可以将 astd::string重新解释为std::vector(适当的)char_type 吗?如果是这样,限制是什么?

0 投票
2 回答
1018 浏览

c++ - 使用 array_view 的指针算法

我刚刚看过 Herb Sutter 的“Writing Good C++14... 默认情况下”(https://www.youtube.com/watch?v=hEx5DNLWGgA)的第一部分,我有一个(可能是愚蠢的)问题关于array_view。

提出的案例是发送一个array_view而不是一个指针和长度以避免指针运算,但是array_view如何处理这样的情况:

array_view 是否支持这种东西,或者我只是把用例弄错了?

0 投票
2 回答
612 浏览

c++ - 地图、集合等的 array_view 替代方案

假设我有一些类层次结构,其中有几个virtual函数返回容器引用:

目前,只能在类的任何子类中实际返回 a vectorset或。但是,对于这一部分,我可以使用例如 a来软化这个限制:mapInterfacevectorgsl::array_view

所以问题是,是否有用于array_view其他容器类型的替代方案?基本上,我想要的是一个轻量级对象,我可以从一个函数返回,该函数将充当某个容器的不可变视图,而无需指定特定的容器类型。std::set将 a 推到类似 an的位置对我来说甚至是有意义的array_view,但支持的操作较少(例如,没有随机访问)。map显然是不同的野兽,需要不同的view支持关联查找,但即使对于 amap我认为有能力说array_view<const std::pair<const int, int>>. 我要求太多了吗?或者也许有合理的方法来实现这一点?或者甚至可能存在这种“视图”的现有实现?

PS:继承不是先决条件-我只是认为这是提出问题的最简单方法。

0 投票
1 回答
1454 浏览

c++ - gsl::array_view> 来自 std::vector

假设我std::vector<std::string>在一个类中有一个成员变量,并且我想使用gsl::array_view和的组合从成员函数将其作为不可变视图返回gsl::cstring_view。不幸的是,以下内容无法编译:

原因是没有可以从中创建cstring_view的容器。array_view所以我的问题是:有没有一种方法可以在不显式添加类似 type 的成员的情况下使用这样的构造std::vector<gsl::cstring_view<>>,这显然是不可取的?

编辑

在我看来,这种“转变”的观点可能更普遍。考虑拥有一个vector拥有指针,例如std::vector<std::shared_ptr<T>>,我想将其作为一个array_view原始指针公开给类的用户:gsl::array_view<const T*>而不公开我的实现定义的存储方法。想法?

0 投票
3 回答
29879 浏览

c++ - gsl 库中的 span 和 array_view 有什么区别?

在最近的几次会议演讲中,我听到 Bjarne Stroustrup 和其他人提到了 C++ 的新编码指南以及一些支持它们的类型。

具体来说,我记得这个例子,span<T>而不是(T* p, int n)作为函数的参数(大约在 32:00 进入谈话时);但我也记得使用的建议array_view<T>。它们是两种选择但相同的概念吗?还是我混淆了事情,它们实际上并没有那么相关?

我似乎找不到任何关于它们应该是什么的权威定义。

0 投票
1 回答
45 浏览

python - Python:修改包含数组视图的单个字典项会修改所有项

我有两个具有相同键的字典。每个项目都是一个ndarray。

我想使用第二个字典中的相应项目修改第一个字典中的每个项目:

我希望得到它J1[iFld][0,0,:,:] = U1[iFld].phaseJ1[iFld][0,1,:,:] = U1[iFld].amplitude但我得到J1[iFld]的是对所有人都是一样的,iFld并且等于所有iFld键的总和U1(当然要跟踪phaseamplitude字段U1)。

对我来说,这看起来像是一个错误,但我只使用 Python 一个月左右(从 matlab 切换)所以我不确定。

问题:这是预期的行为还是错误?为了获得我想要的行为,我应该在我的代码中进行哪些更改?

注意:我选择了的维数dict_keys和以反映我的特殊情况。J1U1