【问题标题】:C++: how do I assign values to a list of vectors efficiently?C ++:如何有效地将值分配给向量列表?
【发布时间】:2011-03-24 11:22:07
【问题描述】:

阅读this question,我决定我需要使用这样的东西:

list<vector<double> > psips;

用于 C++ 中的模拟。问题是,启动这样一个包含N 向量且每个d 为零的列表的最简单(且相当有效)的方法是什么?

干杯!

【问题讨论】:

  • 您确定需要std::vector(动态调整大小),而不是std::array(大小在编译时固定)?
  • @sbi,不,我不是。感谢您的建议。
  • std::array 是下一个 C++ 标准的一部分,目前预计在今年年底。它可能已经在您的标准库中可用。如果没有,可能有std::tr1::array。如果您的编译器也没有(极不可能),那么总会有boost::array

标签: c++ list stl vector


【解决方案1】:
std::list<std::vector<double> > psips(N, std::vector<double>(d));

请参阅 #3 here 和 #2 here

【讨论】:

  • 你需要为你的双精度提供一个默认值,否则它将用垃圾填充它,因为双默认构造函数只是将双精度设置为内存中的任何(垃圾):std::list&lt;std::vector&lt;double&gt; &gt; psips(N, std::vector&lt;double&gt;(d, 0));
  • @jules:不,你没有。引用第二个链接:“2) 构造容器,其中包含具有值 T() 的元素的计数副本。”标准保证double()0.
  • 好吧,这一定是我的误解。我认为 double() 不是将值初始化为零,而是初始化为内存中的内容,这会导致未定义的行为。我想我错了
  • @jules :尽管直到最近才知道许多编译器错误地实现了这一点(臭名昭著的是 VC++),但该标准在 §8.5/5 中保证了这种行为:“对类型的对象进行零初始化T 表示:如果 T 是标量类型,则将对象设置为转换为 T 的值 0(零)。 boost.value_initialized 库的存在主要是为了解决这些编译器缺陷。
【解决方案2】:

你可以使用stl构造函数,并将默认值设置为零:

explicit vector ( size_type n, const T&amp; value= T()); explicit list ( size_type n, const T&amp; value = T())

所以你会做的是:

vector&lt; double &gt; example( d, 0);

list&lt; vector &lt; double &gt; &gt; your_list(N, example);

你有一个包含 N 向量和 d 向量的列表,其中包含零。

【讨论】:

  • 请注意,您不需要将第二个参数 (0) 传递给向量的构造函数,因为这是默认值。
  • +1 用于仅构造一次向量。 (其他答案是为每个实例构建向量)
  • @Basilevs,@ildjarn 提供的答案也仅构造向量的次数与此答案完全相同。向量的N 拷贝都是由@ildjarn 传入的临时拷贝构造的,就像@jules 向量的N 个拷贝是从他传入的命名对象构造的拷贝一样。
【解决方案3】:
 std::list<std::vector<double> > psips(100, std::vector<double>(10, 20.0));

列表中的每个向量都有10 元素,每个元素都用20.0 初始化。列表中此类向量的总数为100

【讨论】:

    猜你喜欢
    • 2018-07-09
    • 2018-12-05
    • 1970-01-01
    • 2017-11-02
    • 2020-04-28
    • 2015-06-10
    • 2023-03-23
    • 2012-07-29
    • 2015-02-09
    相关资源
    最近更新 更多