我想在C++中将列从std::vector<std::vector<double> >
复制到另一个std::vector<std::vector<double> >
。这个问题回答了这个问题,但只涉及所有列都在一个序列中的情况。在我的情况下,内部std::vector
具有8个元素{C1、C2、C3、C4、C5、C6、C7、C8}。新对象需要包含{C4、C5、C6、C8}和所有行。有没有直接做的方法?
在这一步之后,我将对此进行操作,以删除重复的行并将其写入文件中。此外,请建议先做哪项活动(删除"列"或重复项(。
客观地说,外层std::vector
有大约20亿个元素,在去除重复元素后,我最终会得到大约50个元素。因此,一种速度更快、内存高效的方法是非常可取的。
我会使用std::transform
。
它可能看起来像这样:
#include <algorithm> // transform
#include <vector>
#include <iostream>
#include <iterator> // back_inserter
int main() {
std::vector<std::vector<double>> orig{
{1,2,3,4,5,6,7,8},
{11,12,13,14,15,16,17,18},
};
std::vector<std::vector<double>> result;
result.reserve(orig.size());
std::transform(orig.begin(), orig.end(), std::back_inserter(result),
[](auto& iv) -> std::vector<double> {
return {iv[3], iv[4], iv[5], iv[7]};
});
// print the result:
for(auto& inner : result) {
for(auto val : inner) std::cout << val << ' ';
std::cout << 'n';
}
}
输出:
4 5 6 8
14 15 16 18
注意:如果orig
中的任何内部vector<double>
的元素少于8
,则转换将越界访问该数组(因此会产生未定义的行为(,因此,请确保它们都具有所需的元素数量。
或者使用C++20范围从转换view
:创建结果vector
#include <iostream>
#include <ranges> // views::transform
#include <vector>
int main() {
std::vector<std::vector<double>> orig{
{1, 2, 3, 4, 5, 6, 7, 8},
{11, 12, 13, 14, 15, 16, 17, 18},
};
auto trans = [](auto&& iv) -> std::vector<double> {
return {iv[3], iv[4], iv[5], iv[7]};
};
auto tview = orig | std::views::transform(trans);
std::vector<std::vector<double>> result(tview.begin(), tview.end());
// print the result:
for (auto& inner : result) {
for (auto val : inner) std::cout << val << ' ';
std::cout << 'n';
}
}