首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有没有一种方法在c++中分割结构向量?

有没有一种方法在c++中分割结构向量?
EN

Stack Overflow用户
提问于 2021-11-15 06:33:30
回答 3查看 171关注 0票数 7

我有一个名为faces的数据,其定义如下:

代码语言:javascript
运行
复制
struct ivec3 {
    unsigned int v0;
    unsigned int v1;
    unsigned int v2;
};

std::vector<ivec3> faces;

我得到了100个元素(faces.size()= 100 )的faces。

现在我想得到所有的脸的v0。如果我使用Python,我可以这样做

代码语言:javascript
运行
复制
all_v0 = faces[:, 0]

那么,如何像上面的Python代码那样在C++中使用切片操作呢?

非常感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-11-15 06:38:24

您可以在std::transform的帮助下做到这一点。

代码语言:javascript
运行
复制
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; });
票数 7
EN

Stack Overflow用户

发布于 2021-11-15 06:38:18

在C++中没有对向量进行“切片操作”。

但这可以通过一个简单的循环来完成。或者,不使用标准算法(如std::transform )自己编写循环。

考虑您是否实际需要一个具有“片”的新容器,或者您是否满足于拥有一个可以访问这些元素的范围。这类似于使用生成器对象而不是在Python中创建列表。示例:

代码语言:javascript
运行
复制
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的康桓瑋所示。

票数 7
EN

Stack Overflow用户

发布于 2021-11-15 06:55:01

您可以将相应的成员对象指针传递到C++20 views::transform以执行此操作。

代码语言:javascript
运行
复制
#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);
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69970230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档