我有一个矢量矢量,我想把它的内容放到一个列矢量中。即,
输入:A = [[1 2] [3 4]]
输出:v = [[1] [2] [3] [4]](列向量)
在C ++中有快速的方法吗?
答案 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::copy
来std::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}已经为我们提供了这个解决方案。