【问题标题】:Dereferencing iterator to pointers correctly正确取消对指针的迭代器的引用
【发布时间】:2012-11-01 20:49:18
【问题描述】:

我有一个指向对象的指针向量。每个对象都存储一个值并具有一个 toString() 函数,该函数将该值作为字符串返回。我有一个迭代器来遍历向量,我需要通过调用 toString() 来提取每个对象的值。问题是,我不知道如何获得价值。

这个函数最终应该将数字写入文件,但我正在使用 cout 进行测试。

    void writeNumbers(vector<Integer*>& input)
    {
        ofstream write;
        write.open("Integers.txt");
        vector<Integer*>::iterator iter = input.begin();
        for (iter; iter < input.end(); iter++)
        {
            **std::cout << (*iter)->toString() << std::endl;**
        }
        write.close();

I get an Access Violation error which points me to the toString() function:

    std::string Integer::toString()
    {
        std::stringstream ss;
        ss << *(this)->value;
        return ss.str();
    }

toString() works fine whenever I don't try to access it through the iterator.

编辑:toString 中的值实际上是一个指向数字的指针。

Edit2:新的 writeNumbers:

void writeNumbers(vector<Integer*>& input)
{
    ofstream write;
    write.open("Integers.txt");
    vector<Integer*>::iterator iter = input.begin();
    for (iter; iter != input.end(); iter++)
    {
        std::cout << (*iter)->toString() << std::endl;
    }
    write.close();
}

最终编辑:好吧,问题原来是一个糟糕的构造函数,它未能正确初始化指针,所以我离问题的实际位置很远。 :)

Integer::Integer(string input)
{
if(isNaN(input))
value = new int(atoi(input.c_str()));
}

所以它应该是 !isNaN,而且我修复了在错误输入时初始化它的问题:

//New constructor, works 100%
Integer::Integer(string input)
{
if(!isNaN(input))
    value = new int(atoi(input.c_str()));
else
    value = new int(0);
}

【问题讨论】:

  • 我认为这段代码不会编译,更不用说访问冲突了。除非你在某处写了int* Integer::operator-&gt;()

标签: c++ vector iterator dereference


【解决方案1】:

您的 toSting() 有问题。改变

ss &lt;&lt;*(this)-&gt;value;

ss << value;

【讨论】:

  • 这是我没提的错,但是value其实是一个指针。
  • 对此进行扩展,如果我传递指针,它可以工作,但它当然传递地址而不是我需要的值。任何取消引用以传递到字符串流的尝试都会导致访问错误。
【解决方案2】:

编辑:这不是错误,而是使用迭代器时的一般建议。不要使用&lt;检查结束,使用!=

iter < input.end()

应该是这样的:

iter != input.end()

这是因为对于某些容器,

【讨论】:

  • std::vector 具有随机访问迭代器。 &lt; 可以正常工作,尽管 != 更惯用。
  • @PeteBecker 是标准规定的,还是实现定义的?
  • 是的,显然,std::vector 的随机访问迭代器是强制的。
  • @PeteBecker - 我做到了,如果其他人正在寻找这个:保证比较(与预期结果)适用于随机访问迭代器。 (注意:这里双向是不够的)
  • 根据 cmets 编辑了答案。
猜你喜欢
  • 1970-01-01
  • 2019-01-24
  • 2011-04-24
  • 2017-01-26
  • 2013-06-05
  • 2019-03-11
  • 2012-07-11
  • 1970-01-01
  • 2016-09-03
相关资源
最近更新 更多