C++ 迭代器成员行为

C++ 迭代器成员行为,c++,class,pointers,stl,iterator,C++,Class,Pointers,Stl,Iterator,我希望下面的第二个断言能够通过。我请求你的帮助 编辑:当我在任何地方都有poss而不是在某些地方有poss_a时,它不起作用 #include <vector> #include <cassert> class Sampler { public: std::vector<int*> poss; std::vector<int*>::const_iterator poss_it; Sampler(std::vector<int*>

我希望下面的第二个断言能够通过。我请求你的帮助

编辑:当我在任何地方都有poss而不是在某些地方有poss_a时,它不起作用

#include <vector>
#include <cassert>

class Sampler
{
public:
 std::vector<int*> poss;
 std::vector<int*>::const_iterator poss_it;
 Sampler(std::vector<int*> poss_a) : poss(poss_a), poss_it(poss.begin())
 {
  assert( (poss[0]) == (*poss_it) ); //passes
 }
};

int main()
{
 int someInt;
 std::vector<int*> poss_a(1, &someInt);
 Sampler sampler(poss_a);
 assert( ((sampler.poss)[0]) == (*(sampler.poss_it)) ); //passes now

 return 0;
}
#包括
#包括
类采样器
{
公众:
std::向量poss;
std::vector::const_迭代器poss_it;
取样器(std::vector poss_a):poss(poss_a),poss_it(poss.begin())
{
assert((poss[0])==(*poss_it));//传递
}
};
int main()
{
int-someInt;
std::向量poss_a(1,&someInt);
取样器取样器(poss_a);
assert(((sampler.poss)[0])=(*(sampler.poss_it));//现在通过
返回0;
}

可能会对覆盖实例变量的局部变量感到困惑,请尝试

#include <vector>
#include <cassert>

class Sampler
{
public:
    std::vector<int*> poss;
    std::vector<int*>::const_iterator poss_it;
    // THIS IS THE LINE I CHANGED
    Sampler(std::vector<int*> aPoss)    : poss(aPoss), poss_it(poss.begin())
    {
        assert( (poss[0]) == (*poss_it) ); //passes
    }
};

int main()
{
    int someInt;
    std::vector<int*> poss(1, &someInt);
    Sampler sampler(poss);
    assert( ((sampler.poss)[0]) == (*(sampler.poss_it)) ); //fails

    return 0;
}
#包括
#包括
类采样器
{
公众:
std::向量poss;
std::vector::const_迭代器poss_it;
//这是我换的台词
取样器(std::vector aPoss):poss(aPoss),poss_it(poss.begin())
{
assert((poss[0])==(*poss_it));//传递
}
};
int main()
{
int-someInt;
std::向量poss(1,&someInt);
采样器(poss);
断言(((sampler.poss)[0])=(*(sampler.poss_it));//失败
返回0;
}
初始值设定项列表中的
poss\u it(poss.begin())
行正在从poss中提取迭代器,它是构造函数的输入,而不是类的字段

这是一个范围问题。当您在构造函数中时,这很好,因为迭代器是指向函数输入的指针。然而,当您离开构造函数时,它指向内存中的同一个位置,但现在您不知道该位置上有什么

您应该在构造函数中更改输入变量的名称。您想要一个这样做的:

Sampler(std::vector<int*> input) : poss(input), poss_it(poss.begin())
Sampler(std::vector input):poss(input),poss_it(poss.begin())
而你现在的工作是:

Sampler(std::vector<int*> input) : poss(input), poss_it(input.begin())
Sampler(std::vector input):poss(input),poss_it(input.begin())

您实际上是在调用未定义的行为,因为
sampler.poss\u it
是执行第二个
assert
之前销毁的
std::vector
对象的迭代器

问题就在眼前:

Sampler(std::vector<int*> poss) : poss(poss), poss_it(poss.begin())

不混合参数名和成员名如何?如果要编辑问题,请编辑它以更改变量名和参数名,以便更清楚地知道是什么。@Neil Butterworth——如果他这样做了——它会起作用(意思是,这是他的问题——他用参数名隐藏了成员)@娄:我真的不知道他想在这里做什么,我删除了我的推测性答案,我想我已经删除了。和往常一样,真正糟糕的问题得到了选票。唉。@drenami:如果在你改变它之后它失败了,那么你一定是不小心也改变了别的东西。我刚刚测试了代码。它失败了,正如您最初所做的那样,但当您做出我在回答中详细说明的更改时,它就消失了。这是编译、运行并通过两个检查的程序的副本:因为This->poss_是参数的迭代器,This->poss是参数的副本。在工作断言中,您将迭代器与索引结果的参数进行比较,而不是this->poss。稍后将迭代器与此->poss进行比较。解释起来很混乱,因为在三个地方使用了变量名poss——在构造函数中,参数隐藏了成员。
Sampler(const std::vector<int*>& poss_) : poss(poss_), poss_it(poss.begin())