C ++将矢量矢量元素推入矢量

时间:2013-09-18 14:42:47

标签: c++ vector

我只是想知道是否有一个简单,快速的方法是在矢量中插入矢量矢量的元素。例如:

    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'

5 个答案:

答案 0 :(得分:9)

尝试

// 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());
}

答案 1 :(得分:2)

根据你的矢量矢量的构建方式,可能有一种更有效的方法来解决这个问题。

如果您的子向量长度相同(从代码示例中可以看出),那么最好的方法是将myvector视为2D数组并直接构建到此缓冲区中。

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

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

答案 2 :(得分:1)

如果要将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);

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

将myvector的大小调整为vals中向量大小总和的大小。对于vals中的每个向量,将它连接到myvector。想知道如何连续:

Concatenating two std::vectors

相关问题