问题标签 [valarray]
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.
c++ - 在 VC++2005 之后的结构中使用未指定的 std::_ARRAY
我正在迁移一个旧项目以在较新版本的 Visual Studio 中编译。编译旧结构时出现编译器错误 C4430:
我研究了这个错误并发现自 VC++2005 以来,不再允许缺少类型说明符。它不再被解释为整数。
我不熟悉 std::_Array< _Tp > 并且不知道它在带有 sizeof() 的结构中使用时的行为。int _ARRAY(SHOP_ITEM);
只是做这个把戏,还是会操纵结构的大小?
将此结构升级到 VC++2005 及更高版本的正确方法是什么?
c++ - 将 valarray 显式初始化为零的歧义?
std::valarray< double > myArray(3)
产生valarray
长度为 3 的 a,初始化为零。
std::valarray< double > myArray(1,3)
产生valarray
长度为 3 的 a,初始化为 1。
std::valarray< double > myArray(0,3)
产生error: call to constructor of 'std::valarray<double>' is ambiguous
.
我当然可以使用myArray(3)
并添加一条注释,确认它已初始化为零,但根据我自己的理解,我希望有人能解释为什么这是模棱两可的——它是否以我错过的方式与另一个构造函数冲突?
c++ - libstdc++ 中的 mask_array 行为
情况1:
案例2:
案例3:
案例 1 和案例 2 都按预期工作(数据经过适当修改)。但是,案例 3 失败得可怕且不可靠(对我来说它是分段错误的)。在使用 gdb 进一步检查后,看起来内部存储的掩码指向临时data <= 2
valarray 的缓冲区,该缓冲区在第 2 行之后被销毁。然后当第 3 行进行写入时,掩码完全是垃圾,并试图对其进行索引设置数据的掩码值是未定义的行为。
我在标准中的任何地方都找不到为什么允许这种行为(标准对 valarray 非常模糊)。这是 libstdc++ 的失礼,还是我应该期待这个结果,为什么?
编译器设置测试:
- g++4.8.2 -O0 -g -std=c++0x
- clang++ -O0 -g -std=c++11
我相信我的 libstdc++ 版本是 3.4.19(只是按照这个找到它)
c++ - 在什么意义上 valarray 没有混叠?
一个经常提出的主张是std::valarray
旨在消除某些形式的混叠以实现更好的优化(例如,请参阅valarray 与向量:为什么引入了 valarray?)
谁能详细说明这一说法?在我看来,只要您可以获得指向元素的指针,别名总是可能的——您可以获得,因为operator[]
返回一个引用。
c++ - gcc和msvc(或Linux和Windows)中的valarray有什么区别
我在 Windows 和 Linux 中遇到了不同的 valarray 行为。有谁知道这个或知道在哪里看?很明显,在这两个系统上运行的一个版本是正确的 C++,但为什么另一个在 Windows 上工作?valarray的实现还有更多的区别吗?
在 MSVC/Windows 上工作但在 gcc/Linux 上不工作的代码示例:
我跟踪它以修复 gcc/Linux 版本的代码:
gcc/Linux 版本期望 l-value (myValues) 已经初始化。这在 MSVC/Windows 上似乎没有必要。我可以调用myValues.resize(1)
Linux,它也可以工作。
现在,有谁知道确切的差异或互联网上的资源?是否有如何使用 valarray 的最佳实践?
软件版本:
- Windows 7、MS Visual Studio 2010 SP1、Visual C++ 编译器 16.00.40219.01 用于 80x86
- 虚拟机上的 Lubuntu 14.04 64 位,GNU Make 3.81,GCC 4.8.2
感谢大家。
更新:详细的代码示例。是否编译。第一个示例在 Linux 中给出了分段错误,但在 Windows 中运行良好。
以下示例在 Linux 和 Windows 上运行良好。注意 for 循环中 myValues 的声明和初始化,就在切片完成的地方。
预期输出:
c++ - How do I initialize a valarray from a vector?
Is it ok/safe/good practice to write the following in order to fill a valarray with the content of a vector?
It seems to work fine but I would like to be sure it works on any case.
c++ - 为什么 std::valarray 没有采用一对迭代器的构造函数?
问题来自我对这个问题的不经意间的回答(我已经删除了原因,好吧,std::valarray
没有构造函数采用一对迭代器......)。
问题是:为什么?
c++ - 将数据从 std::vector 传递到 std::valarray 的最有效方法
std::vector
将数据从 a 设置为 a的最有效方法是std::valarray
什么?假设我们有std::valarray<double> my_valarray;
并且std::vector<double> my_vector;
我们想要将数据从 复制my_vector
到my_valarray
:
选项 1(使用valarray
构造函数和复制赋值):
选项 2(调整大小和复制):
出现问题是因为在这两种情况下,复杂度看起来都是O(2n)。在第一种情况下,数据valarray
在构造期间被复制到临时的(一个分配 + 一次复制数据),然后分配给最终对象(一个分配 + 一次复制数据)。在第二种情况下,有一个分配 + 一个通道用于将所有元素初始化为零,另一个通道用于复制数据。C++11 的移动语义是否适用于第一种情况,使其只需要一次分配和一次传递来复制数据?
c++ - 用 std::valarray 替换 POD C 样式数组是不是一个坏主意?
我正在使用一个写得不好并且有很多内存泄漏的代码库。
它使用了很多包含原始指针的结构,主要用作动态数组。
尽管结构通常在函数之间传递,但这些指针的分配和释放是随机放置的,不容易跟踪/推理/理解。
我将其中一些更改为类,并且这些指针将由类本身进行 RAIIed。它们运行良好并且看起来并不难看,只是我禁止复制构造和复制分配这些类只是因为我不想花时间实现它们。
现在我在想,我是在重新发明轮子吗?为什么不用 std:array 或 std::valarray 替换 C 样式的数组?
我更喜欢 std::valarray 因为它使用堆内存和 RAIIed。并且 std::array 在我的开发环境中(还)不可用。
Edit1:std::array 的另一个优点是这些动态数组中的大多数是 POD(主要是 int16_t、int32_t 和 float)数组,并且数字 API 可以使生活更轻松。
在开始之前,我有什么需要注意的吗?
我能想到的一个可能是没有一种简单的方法可以将 std::valarray 或 std::array 转换回 C 样式数组,并且我们的部分代码确实使用了指针算法并且需要将数据呈现为纯 C样式数组。
还要别的吗?
编辑 2
我最近遇到了这个问题。一个非常糟糕的事情std::valarray
是它在 C++11 之前不能安全地复制分配。
正如该答案中所引用的,在 C++03 及更早版本中,如果源和目标的大小不同,则为 UB。
c++ - 通过成员初始化列表初始化结构
所以我正在从 Stephen Prata 的书中学习 C++,我想做一个练习......所以问题是这样的:
我想在结构中使用 std::valarray ,在这样的类中:
并通过成员初始化列表对其进行初始化:
但它只是不想工作。不知何故,编译器不喜欢这个“。” 访问初始值设定项列表中m_numericData结构的成员。
我可以放弃Pair结构并将valYear和valBottlesNum作为简单的类成员变量并像这样初始化它们......
但我真的很想知道如何解决这种问题。
提前感谢!