将非连续列从一个数组复制到另一个数组C++中,并基于1列删除重复列



我想在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';
}
}

最新更新