C++ 是否可以使用迭代器创建成员字段的值列表?

C++ 是否可以使用迭代器创建成员字段的值列表?,c++,algorithm,data-structures,iterator,c++-standard-library,C++,Algorithm,Data Structures,Iterator,C++ Standard Library,考虑以下结构 结构对 { INTA; std::字符串b; }; 我有一个std::vector pairs,但我想要一个std::vector ListOfFromPairs,其中包含对列表中b的所有值 我想在一个班轮这样做 我以前使用过OpenGL,我以前创建过一个结构,指定了一个起点 pairs.begin() + offsetof(Pair, b) 给定一个步长(内存中pair对象的大小)和我想要解析的东西的数量,它已经完成了我在这里要做的事情 这也是可能的吗?使用C++迭代器?<

考虑以下结构

结构对
{
INTA;
std::字符串b;
};
我有一个
std::vector pairs
,但我想要一个
std::vector ListOfFromPairs
,其中包含对列表中b的所有值

我想在一个班轮这样做

我以前使用过OpenGL,我以前创建过一个结构,指定了一个起点

pairs.begin() + offsetof(Pair, b)
给定一个步长(内存中pair对象的大小)和我想要解析的东西的数量,它已经完成了我在这里要做的事情

这也是可能的吗?使用C++迭代器?< /P> 我有一个特定的用例,我想创建一组无序的Vulkan扩展名,但是Vulkan返回包含扩展名作为成员的结构。然后,我将使用无序集检查我的应用程序想要使用的扩展

我想要一个包含
对列表中
b
的所有值

我想在一个班轮里做这个

当然可以。您可以像这样使用from头

#include <algorithm> // std::transform
#include <iterator>  // std::back_inserter

std::vector<Pair> pairs;
std::vector<std::string> listOfBFromPairs;
listOfBFromPairs.reserve(pairs.size()); // reserve the memory for unwanted reallocations

std::transform(pairs.begin(), pairs.end(),
   std::back_inserter(listOfBFromPairs), [](const Pair& pair) { return pair.b; }
);

当您要求使用单行程序时,这里有一种增强方法(IMHO不太可读):


(其中只有
copy\u range
的实例化已更改)。您可以在C++20范围内实现类似的功能。

您关心重复的功能吗?如果你不这样做,那么这是微不足道的。如果你这样做了,你要么需要选择一个
集合
而不是
向量
,要么你以后需要删除重复项,但它不再是一个线性集。如果你想要一个无序的集合,那你为什么要创建向量?直接创建无序的_集即可。vulkan API返回一个结构数组。GLFWAPI返回一个字符串数组。它们保证是独一无二的。我使用的是无序集,因为我需要O(1)查找
#include <unordered_set>
#include <algorithm> // std::transform
#include <iterator>  // std::inserter

std::vector<Pair> pairs;
std::unordered_set<std::string> listOfBFromPairs;

std::transform(pairs.begin(), pairs.end(),
   std::inserter(listOfBFromPairs, listOfBFromPairs.end()), [](const auto& pair) { return pair.b; }
);
#include <boost/range/adaptor/transformed.hpp>
#include <functional>

const std::vector<Pair> src;

const auto listOfBFromPairs = boost::copy_range<std::vector<std::string>>(src | boost::adaptors::transformed(std::mem_fn(&Pair::b)));
const auto listOfBFromPairs = boost::copy_range<std::unordered_set<std::string>>(src | boost::adaptors::transformed(std::mem_fn(&Pair::b)));