如何将矢量内容向量转换为单个列向量

时间:2017-12-20 21:03:59

标签: c++ vector

我有一个矢量矢量,我想把它的内容放到一个列矢量中。即,

输入:A = [[1 2] [3 4]]

输出:v = [[1] [2] [3] [4]](列向量)

在C ++中有快速的方法吗?

4 个答案:

答案 0 :(得分:2)

像这样:

std::vector<std::vector<int>> a = {{1, 2}, {3, 4}};
std::vector<std::vector<int>> b;
for ( auto& row : a )
{
   for ( auto item: row )
   {
      b.push_back(std::vector<int>{item});
   }
}

答案 1 :(得分:1)

您可以使用std::copystd::back_inserter每行int main() { std::vector<std::vector<int>> v = {{1, 2, 3}, {2, 2, 3}}; std::vector<int> b; for(auto& vec : v){ std::copy(vec.begin(), vec.end(), std::back_inserter(b)); } } ,如下所示:

C-h v

答案 2 :(得分:1)

如果要将矢量矢量中的所有元素复制到单个矢量中,请使用这两个循环:

std::vector<std::vector<int>> vv = { { 1, 2, 3 },
                                     { 4, 5, 6 },
                                     { 7, 8, 9 } };
std::vector<int> v;
for (auto row : vv) {
    for (auto el : row) {
        v.push_back(el);
    }
}
//print out the vector:
for (auto el : v) {
    std::cout << el << ' ';
}

或使用std::copy功能。

答案 3 :(得分:1)

不幸的是我必须告诉你,至少到目前为止,其他所有答案都不如看起来那么好。

让我们逐步解答;最后我告诉你如何正确处理它。

std::vector<std::vector<int>> v = {{1, 2, 3}, {2, 2, 3}};
std::vector<int> b;
for(auto& vec : v){
    std::copy(vec.begin(), vec.end(), std::back_inserter(b)); // performes single insertion at the end
}

std::copy是插入std::vector的不良风格。您可以在目标向量的末尾按值插入值。这意味着可能需要更多的重新分配和移动/复制。

std::vector<std::vector<int>> vv = { { 1, 2, 3 },
                                     { 4, 5, 6 },
                                     { 7, 8, 9 } };
std::vector<int> v;
for (auto row : vv) {
    for (auto el : row) {
        v.push_back(el);
    }
}

同样在这里。你在每push_back调整一次大小,这绝对没有必要!

我建议您使用std::vector::insert。它自己执行一些内部调整。

std::vector<std::vector<int>> v = {{1, 2, 3}, {2, 2, 3}};
std::vector<int> b;
for(auto& vec : v){
    b.insert(std::cend(b), std::cbegin(vec), std::cend(vec));
}

此解决方案在发生任何插入之前执行调整大小。这将带来最佳性能。

这里有一些测试代码。自己尝试一下:

#include <vector>
#include <chrono>
#include <iostream>

int main()
{
    std::vector<int> v(100'000'000, 5);
    auto start = std::chrono::steady_clock::now();
    std::vector<int> b;
    b.insert(std::cend(b), std::cbegin(v), std::cend(v));
    auto end = std::chrono::steady_clock::now();
    std::cout << "insert durtion:\t" << (end - start).count() << std::endl;

    b = std::vector<int>();

    start = std::chrono::steady_clock::now();
    std::copy(std::cbegin(v), std::cend(v), std::back_inserter(b));
    end = std::chrono::steady_clock::now();
    std::cout << "copy durtion:\t" << (end - start).count() << std::endl;

    b = std::vector<int>();

    start = std::chrono::steady_clock::now();
    for (auto el : v)
        b.push_back(el);
    end = std::chrono::steady_clock::now();
    std::cout << "copy durtion:\t" << (end - start).count() << std::endl;
    std::cin.ignore();
    return 0;
}

在此输出中生成x64版本:

insert durtion:         132388657
copy durtion:           844505239
push_back durtion:      866565409

最后,您当然可以先resize向量然后开始复制,但我认为这是处理错误的方法,如果实际上是{{1}已经为我们提供了这个解决方案。