3

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

例如:

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());- 没有匹配的成员函数调用“插入”

4

5 回答 5

10

尝试

// 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());
}
于 2013-09-18T14:48:32.793 回答
2

根据您的向量向量最初是如何构建的,可能有一种更有效的方法来解决这个问题。

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

如果子向量长度可以变化,但构建向量向量的代码实际上只在末尾添加了东西,那么您可以使用我在此处描述的“折叠向量向量”类来构建此数据,而不是向量的向量。(在那之后,你的数据已经在你正在寻找的那种连续缓冲区中了。)

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

于 2013-11-26T13:52:03.107 回答
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);
于 2013-09-18T14:57:39.980 回答
0

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

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

于 2013-09-18T14:48:43.870 回答
0

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

连接两个 std::vectors

于 2013-09-18T14:49:02.150 回答