这是我关于容器的小大问题,尤其是数组。
我正在编写一个物理代码,主要操纵一大组(> 1 000 000)“粒子”(每个粒子有 6 个 double 坐标)。我正在寻找最佳方式(在性能方面)来实现一个类,该类将包含这些数据的容器并为这些数据提供操作原语(例如实例化、operator[] 等)。
这个集合的使用有一些限制:
第一个结论,因为对元素的访问基本上是通过使用 [] 一个一个地访问每个元素来完成的。 ,我认为我应该使用普通的动态数组。
我已经探索了一些东西,我想听听你对哪一个能给我最好的表现的意见。
据我所知,使用动态分配的数组而不是 std::vector 没有任何优势。 , 所以像 double** array2d = new ..., loop of new, etc 这样的东西被排除。
那么使用 std::vector<double> 是个好主意吗? ?
如果我使用 std::vector , 我应该创建一个像 std::vector<std::vector<double> > my_array 这样的二维数组吗?可以像my_array[i][j]一样被索引, 或者这是一个坏主意,最好使用 std::vector<double> other_array并使用 other_array[6*i+j] 访问它.
也许这可以提供更好的性能,尤其是因为列数是固定的并且从一开始就已知。
如果您认为这是最佳选择,是否可以将此 vector 包装成可以使用定义为 other_array[i,j] // same as other_array[6*i+j] 的索引运算符访问的方式?没有开销(比如每次访问时的函数调用)?
另一个选项,我目前使用的选项是使用 Blitz,特别是 blitz::Array :
typedef blitz::Array<double,TWO_DIMENSIONS> store_t;
store_t my_store;
像这样访问我的元素的地方:my_store(line, column); .
我认为在我的案例中使用 Blitz 没有太多优势,因为我正在一个接一个地访问每个元素,如果我直接在数组上使用操作(如矩阵乘法),Blitz 会很有趣,而我不是。
您认为 Blitz 还可以,还是对我没用?
这些是到目前为止我考虑过的可能性,但也许我还有一个是最好的,所以请不要犹豫向我建议其他事情。
非常感谢您对这个问题的帮助!
编辑:
从下面非常有趣的答案和评论来看,一个好的解决方案似乎如下:
particle (包含 6 个 double )或 6 个 double 的静态数组(这避免使用二维动态数组)vector或 deque这个 particle结构或数组。然后最好用迭代器遍历它们,这将允许以后从一个更改为另一个。此外我还可以使用 Blitz::TinyVector<double,6>而不是结构。
最佳答案
So is it a good idea to use
std::vector<double>?
通常,一个 std::vector应该是容器的首选。您可以使用 std::vector<>::reserve()或 std::vector<>::resize()以避免在填充 vector 时重新分配。是否有其他容器更好,可以通过测量来发现。而且只能通过测量。但首先要衡量容器涉及的任何事情(填充、访问元素)是否值得优化。
If I use a std::vector, should I create a two dimensional array like
std::vector<std::vector<double> >[...]?
没有。 IIUC,您正在访问每个粒子的数据,而不是每行。如果是这样,为什么不使用 std::vector<particle> , 其中particle是一个包含六个值的结构吗?即使我理解不正确,您也应该在一维容器周围编写一个二维包装器。然后将您的数据按行或按列对齐 - 使用您的访问模式可以更快。
Do you think that Blitz is OK, or is it useless in my case?
我对 blitz++ 及其使用领域一无所知。但是 blitz++ 不就是关于表达式模板以展开循环操作并在进行矩阵操作时优化掉临时变量吗? ICBWT。
关于c++ - 选择性能最高的容器(阵列),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3607216/
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
状态:我正在构建一个应用程序,其中需要一个可供用户选择颜色的字段,该字段将包含RGB颜色代码字符串。我已经测试了一个看起来很漂亮但效果不佳的。它是“挑剔的颜色”,并托管在此存储库中:https://github.com/Astorsoft/picky-color.在这里我打开一个关于它的一些问题的问题。问题:请建议我在Rails3应用程序中使用一些颜色选择器。 最佳答案 也许页面上的列表jQueryUIDevelopment:ColorPicker为您提供开箱即用的产品。原因是jQuery现在包含在Rails3应用程序中,因此使用基
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
我希望用户从一个模型的三个选项中选择一个。即我有一个模型视频,可以被评为正面/负面/未知目前我有三列bool值(pos/neg/unknown)。这是处理这种情况的最佳方式吗?为此,表单应该是什么样的?目前我有类似的东西但显然它允许多项选择,而我试图将它限制为只有一个..怎么办? 最佳答案 如果要使用字符串列,让我们说rating。然后在你的表单中:#...#...它只允许一个选择编辑完全相同但使用radio_button_tag: 关于ruby-on-rails-Rails单选按钮-模
我的Rails应用程序中安装了carrierwave。但是,当用户上传多页pdf时,我只希望应用程序获取文档中的第一页并将其转换为jpeg。这可能吗?用什么命令?这是我的uploader。#encoding:utf-8classImageUploader[200,300]##defscale(width,height)##dosomething#end#Createdifferentversionsofyouruploadedfiles:version:thumbdoprocess:resize_to_fill=>[150,210]process:convert=>:jpgdefful
对于用户模型,我有一个过滤器来检查用户的预订状态,该状态由整数值(0、1或2)表示。UserActiveAdmin索引页上的过滤器是通过以下代码实现的:filter:booking_status,as::select然而,这会导致下拉选项为0、1或2。当管理员用户从下拉列表中选择它们时,我更愿意自己将它们命名为“未完成”、“待定”和“已确认”之类的名称。有没有办法在不改变booking_status在模型中的表示方式的情况下做到这一点? 最佳答案 假设booking_status是模型中的枚举字段,您可以使用:过滤器:booking
我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“
我正在使用Ruby解决一些ProjectEuler问题,特别是这里我要讨论的问题25(Fibonacci数列中包含1000位数字的第一项的索引是多少?)。起初,我使用的是Ruby2.2.3,我将问题编码为:number=3a=1b=2whileb.to_s.length但后来我发现2.4.2版本有一个名为digits的方法,这正是我需要的。我转换为代码:whileb.digits.length当我比较这两种方法时,digits慢得多。时间./025/problem025.rb0.13s用户0.02s系统80%cpu0.190总计./025/problem025.rb2.19s用户0.0