在函数中传递向量

Posted

技术标签:

【中文标题】在函数中传递向量【英文标题】:Passing a vector in a function 【发布时间】:2017-08-09 01:00:17 【问题描述】:

晚上好。我试图减少我的代码的处理时间,我意识到传递一个在每个循环后不断增长的二维向量会增加处理时间。有没有办法增加向量的访问时间或者我应该考虑一个新的容器(即列表、双端队列等) 这是我的代码示例:

这是我的功能:

bool MyFunction(std::vector < std::vector <int> > &p_vector2, std::vector <int> &p_vector, int p)

std::vector &lt; std::vector &lt;int&gt; &gt; &amp;p_vector2 每循环一次就增长 1 个向量。

谢谢。

【问题讨论】:

本题多处使用“增加处理时间”。你的意思是你想让你的功能更快吗?如果是这样,您可能应该重新提出问题以更清楚地说明问题到底是什么。 是的,我想让函数更快。我注意到在二维向量包含超过 400 个向量之后,该函数需要更多时间来处理。我尝试使用 & 传递参数作为参考,这让我获得了几秒钟的时间,但我的向量将包含 10 000 000 个向量,因此我需要我能得到的所有帮助。 您确定不是您在函数中执行的操作会降低您的代码速度,而不是将向量传递给函数吗? 您仍应改写问题以使其更清晰。 :) 如果不查看代码和一些基准,很难诊断问题。从我所读到的一般情况下,vector 往往是更快的 STL 容器之一。我会先专注于优化你的算法。 显示更多代码。 【参考方案1】:

我会考虑使用矢量的 resize() 方法,而不是通过 push_back 或类似方法一一相加。 resize 将预先分配空间,因此您不必为每个项目继续分配新内存。

http://www.cplusplus.com/reference/vector/vector/resize/

另一个需要考虑的选择是在函数调用之前分配子向量,并且让向量的向量只维护指针。您需要自己进行客观破坏。

【讨论】:

其实resize()完全调整vector的大小,而reserve()只是提前预留空间,不需要改代码。顺便说一句,没有一个会带来显着的改善。【参考方案2】:

除非您使用数组(这与其他容器完全不同),否则使用新容器将无济于事。 您的问题可以通过将代码更改为std::vector &lt; std::vector &lt;int&gt;&amp; &gt; &amp;p_vector2 来解决,但小心;现在你的向量的每个新成员都不仅仅是其他东西的副本,而是另一个向量本身。因此,如果您的向量定义在一个范围内并且范围结束,c++ 将简单地删除该向量并且您将没有任何内容作为您的向量成员(=> 运行时错误肯定)。

我建议您每次要声明一个向量以供父向量使用时都使用new std::vector &lt;int&gt;(),这样您就克服了前面的问题,但是您应该使用delete来释放内存,否则您的代码将有内存泄漏。

如果我站在你的立场上,我会阅读更多关于指针以及如何使用它们的信息,因为new 返回一个指针,如果你不进一步学习,你可能会遇到困难。

【讨论】:

这是一个基于函数原型的相当复杂的猜测。 实际上,我没有看到任何更简单的解决方案来解决这个问题。 我的意思是,当无法知道我们看不到的代码中发生了什么时,您如何回答问题?可能有许多不同的优化方法和/或分析方法可能存在缺陷。你的答案充其量只是猜测。

以上是关于在函数中传递向量的主要内容,如果未能解决你的问题,请参考以下文章

通过引用函数传递向量,但更改不会持续

通过指针在函数之间传递向量

将向量传递给C++中的线程函数

打印传递给打印函数的向量[关闭]

将向量传递给模板函数

将基类向量传递给接受超类向量的函数