【问题标题】:C++ pushing elements of a vector of vectors into a vectorC ++将向量向量的元素推入向量
【发布时间】:2013-09-18 14:42:47
【问题描述】:

我只是想知道是否有一种简单、快速的方法可以将向量中的元素插入向量中。

例如:

std::vector<std::vector<double> > vals
{

    {1, 2, 3, 4, 5, 6},
    {1, 2, 3, 4, 5, 6}
};
std::vector<double> myvector;

所以myvector 将包含:1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6

我尝试过使用insertpush_back,但没有成功。

编辑:

我用过:

myvector.insert(vals.begin(), vals.end()); - 没有匹配的成员函数可以调用“插入”

【问题讨论】:

  • 请显示您使用的确切代码。
  • 人们会认为两个普通的insert 就足够了。
  • 我认为您的意思是您希望将向量inside向量的元素插入到另一个向量中,对吗?如果是,请重新措辞。
  • @davmac 是的,但是,我希望将它们插入一个 vector 我不需要另一个 std::vector&lt;vector&lt;double&gt; &gt;
  • 对,那么您需要在问题中澄清这一点。您说“插入向量向量的元素”,但那些将是向量。你的意思是元素 inside 这些向量。

标签: c++ vector


【解决方案1】:

试试

// c++11
for(auto && v : vals){
  myvector.insert(myvector.end(), v.begin(), v.end());
}

// non c++11
for(std::vector<std::vector<double> >::const_iterator it = vals.begin(), end = vals.end(); it != end; ++it){
  myvector.insert(myvector.end(), it->begin(), it->end());
}

【讨论】:

  • 一个普通的 first 参考就足够了。
  • @RedX - no matching member function for call to 'insert' 有什么想法吗?
  • 这里有一个简单的优化,首先是调整 myvector 的大小。这可以防止不必要的重新分配。
  • @JoachimPileborg 我记得在某处读过,如果编译器认为这里的引用足够了,那么&amp;&amp; 无论如何都会使用它。如果它认为移动也很好,那么它可能会使用它。还是我弄错了?
  • 内循环应该是 myvector.insert(myvector.end(), v.begin(), v.end())
【解决方案2】:

根据最初构建向量向量的方式,可能有更有效的方法来解决此问题。

如果您的子向量的长度都相同(从代码示例中看来就是这种情况),那么最好的办法是将 myvector 视为 2D 数组并直接构建到此缓冲区中。

如果子向量长度可以变化,但构建向量向量的代码实际上只会在末尾添加内容,那么您可以使用类似the 'collapsed vector vector' class I describe here 的东西来构建此数据,而不是向量的向量。 (在那之后,你的数据已经在你正在寻找的那种连续缓冲区中了。)

无论哪种方式,如果性能或内存占用在这里很重要,那么避免向量构造的向量可以消除大量缓冲区操作开销,并且是一项非常重要的优化。

【讨论】:

    【解决方案3】:

    如果要将vals 的所有元素插入到单个向量中:

    蛮力法

    for (int i = 0; i < vals.size(); ++i)
    {
        for (int j = 0; j < vals[i].size(); ++j)
        {
            myvector.push_back(vals[i][j]);
        }
    }
    

    更优雅的方法

    struct AddVector
    {
        std::vector<double> myvector;
        void operator()(const std::vector<int>& a)
        {
            std::copy(a.begin(), a.end(), std::back_inserter(myvector));
        }
    };
    
    // somewhere in your code
    AddVector av;
    std::for_each(vals.begin(), vals.end(), av);
    myvector.swap(av.myvector);
    

    【讨论】:

      【解决方案4】:

      变量vals 是向量的向量,但myvector 是双精度向量。尝试从第一个插入到第二个将不起作用,因为包含的类型不同(std::vector&lt;double&gt;double)。

      相反,您必须手动将vals 的每个子向量插入myvector

      【讨论】:

        【解决方案5】:

        将 myvector 的大小调整为 vals 中向量大小之和的大小。对于 vals 中的每个向量,将其连接到 myvector。要了解如何连接:

        Concatenating two std::vectors

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-14
          • 1970-01-01
          相关资源
          最近更新 更多