C++ c++;如何在结构向量的一个字段上创建迭代器

C++ c++;如何在结构向量的一个字段上创建迭代器,c++,vector,struct,iteration,C++,Vector,Struct,Iteration,我有一个所有基本类型的结构,如下所示: struct record { int field1; double field2; } vector<record> records; 我有一个该结构实例的向量,如下所示: struct record { int field1; double field2; } vector<record> records; 矢量记录; 是否可能/最好的方法是创建一个将在field1上迭代的vector:

我有一个所有基本类型的结构,如下所示:

struct record {
    int field1;
    double field2;
}
vector<record> records;
我有一个该结构实例的向量,如下所示:

struct record {
    int field1;
    double field2;
}
vector<record> records;
矢量记录;
是否可能/最好的方法是创建一个将在
field1
上迭代的
vector::iterator
? 如果我使用数组
记录记录[n]
,会怎么样?我需要看起来像
vector::iterator
的东西


编辑:我需要一个
向量::迭代器

您可以在原始
向量上使用lambdas

例如:

for_each(records.begin(), records.end(), [](record& foo){/*operate on foo.field1 here*/});
请注意,绝大多数其他算法也接受lambda,因此您可以使用lambda访问原始
向量
,只访问
字段1

我在这里是自以为是的,但你正在寻找的行为似乎与
地图的行为非常相似,所以你可能想看看


我想你是在追求刺激和邪恶,你也可以用这个拼凑一些东西:

看起来你是在要求这样的东西

for(std::vector<record>::iterator i=records.begin(), end=records.end(); i!=end; ++i)
{
    std::cout << i->field1 << std::endl;
}
for(std::vector::iterator i=records.begin(),end=records.end();i!=end;++i)
{
std::cout field1生成迭代器适配器
首先,最简单的解决方案是迭代容器并从迭代器访问字段

for (auto&& r : records) {
    int value = r.field1;
    /* do something with 'value' */
}
struct my_it : public std::vector<record>::iterator {
    using std::vector<record>::iterator::iterator;
    int operator*() { return std::vector<record>::iterator::operator*().field1; }
};
无论如何,如果你真的想要一个迭代器在被取消引用时返回
field1
,你可以很容易地实现一个从容器自己的迭代器派生的迭代器适配器

for (auto&& r : records) {
    int value = r.field1;
    /* do something with 'value' */
}
struct my_it : public std::vector<record>::iterator {
    using std::vector<record>::iterator::iterator;
    int operator*() { return std::vector<record>::iterator::operator*().field1; }
};
这是一个XY问题吗? 正如在的回答中所解释的,没有办法创建一个
std::vector::iterator
,该迭代器迭代存储在连续数组中的
int
元素之外的其他元素

如果您需要一个接受输入迭代器的函数,那么将其作为模板函数。这样,它将与任何容器类型的迭代器一起工作。这就是标准库中所有算法的实现方式

template <typename InputIt>
void func(InputIt first, InputIt last) {
    for (; first != last; ++first) {
        value = *it; // Dereferences input iterator of any type.
    }
}
模板
无效函数(先输入,后输入){
for(;first!=last;++first){
value=*it;//取消引用任何类型的输入迭代器。
}
}
迭代器应通过其操作(即读取、递增、递减、随机访问)连接,而不是显式类型。迭代器按其支持的操作数进行分类

例如,如果需要在一个范围内迭代并在一次过程中读取所有值,则需要输入迭代器作为参数。迭代器本身的类型应该是无关的

你真倒霉

vector::iterator
不是多态的1。没有地方可以进入并更改指针步长。
vector::iterator
只迭代一系列连续的int
对象,并且您的
int
对象不会连续存储

<>这就是为什么所有C++标准算法都被模板化为接受任何类型的迭代器的原因。如果你的函数是一个模板,接受任意迭代器类型,那么你可以使用一个像一个SNP写的迭代器适配器。

1相对于指针运算而言,多形运算速度较慢,如果它没有与普通数组类似的性能,没有人会使用
std::vector
,如果您确实想要一个成员迭代器,可以执行以下操作:

for (my_it it = std::begin(records); it != std::end(records); ++it) {
    int value = *it; // Dereferencing now returns 'field1'.
}
模板
结构成员特征;
模板
结构成员特征
{
使用类别_type=C;
使用返回类型=T;
};
模板
结构成员\迭代器:迭代器
{
公众:
使用迭代器::迭代器;
模板
成员迭代器(I&&begin、成员&&member)
:std::vector::迭代器(std::forward(begin))
,成员(标准::转发(成员))
{
静态_断言(std::is_成员_指针::值,
“成员必须是可撤销引用的”);
}
typename成员特征::返回类型和运算符*()
{
返回(*static_cast(*this)).*成员;
}
私人:
M成员;
};
模板
自动生成成员迭代器(成员&&member,迭代器&&it)
->成员迭代器
{
返回{std::forward(it),std::forward(member)};
}
结构记录
{
int field1;
双字段2;
};
int main()
{
向量v{{1,1.0},{2,2.0},{3,3.0};
for(auto it=make_member_迭代器(&Record::field1,v.begin());it!=v.end();+it)
{

std::您是否看错了方向。在容器上创建一个迭代器,并且仅访问字段1(如果仅此而已)want@B-Brock你是想用这个向量搜索,还是什么?为什么你需要这样一个迭代器?你是想把它传递给另一个函数吗?如果是,这个函数有什么要求(指针,随机访问迭代器,向量迭代器,)@BenVoigt是的——没错。我想传递它的函数采用
begin
end
迭代器类型
vector::iterator
。我已经在代码的其他部分使用了它,从实际的
vector
s传入迭代器。它总是相同的“类型”对我来说,
int
代表时钟跳变,所以我想做一个继承的事情,但我真的不想做一个1字段的结构,你知道吗?非常感谢你的建议!我需要它“看起来像”虽然是一个
vector::iterator
。我做了一个编辑——我应该说是一个
vector::iterator
。这很有帮助,但我认为“使用std::vector::iterator::iterator;”在语法上是不正确的。iterator没有定义::iterator。另外,我必须从std::vector::iterator为struct my定义一个构造函数。Otherwise我不能从std::begin(records)创建我的_it。类似于
my_it(std::vector::iterator it){*(std::vector::iterator*)this=it;}
使用基本调用语法,比如
return iterator::operator*()member;
,或者您担心
operator*
可能是非成员吗?