我有一个名为faces的数据,其定义如下:
struct ivec3 {
unsigned int v0;
unsigned int v1;
unsigned int v2;
};
std::vector<ivec3> faces;
我得到了100个元素(faces.size()= 100 )的faces。
现在我想得到所有的脸的v0。如果我使用Python,我可以这样做
all_v0 = faces[:, 0]
那么,如何像上面的Python代码那样在C++中使用切片操作呢?
非常感谢!
发布于 2021-11-15 06:38:24
您可以在std::transform
的帮助下做到这一点。
std::vector<int> all_v0;
all_v0.reserve(faces.size());
std::transform(faces.begin(), faces.end(),
std::back_inserter(all_v0),
[] (const ivec3& i) { return i.v0; });
发布于 2021-11-15 06:38:18
在C++中没有对向量进行“切片操作”。
但这可以通过一个简单的循环来完成。或者,不使用标准算法(如std::transform
)自己编写循环。
考虑您是否实际需要一个具有“片”的新容器,或者您是否满足于拥有一个可以访问这些元素的范围。这类似于使用生成器对象而不是在Python中创建列表。示例:
auto get_v0 = [](const auto& v) -> auto {
return v.v0;
};
auto v0_range = std::ranges::transform_view(
faces,
get_v0
);
// access the objects:
for (auto v0 : v0_range) {
// use v0
}
// or if you do need a container:
std::vector v0s(begin(v0_range), end(v0_range));
您也可以使用一个成员指针来代替这个函数,如answer的康桓瑋所示。
发布于 2021-11-15 06:55:01
您可以将相应的成员对象指针传递到C++20 views::transform
以执行此操作。
#include <ranges>
#include <vector>
struct ivec3 {
unsigned int v0;
unsigned int v1;
unsigned int v2;
};
int main() {
std::vector<ivec3> faces;
auto v0s = faces | std::views::transform(&ivec3::v0);
auto v1s = faces | std::views::transform(&ivec3::v1);
auto v2s = faces | std::views::transform(&ivec3::v2);
}
https://stackoverflow.com/questions/69970230
复制相似问题