正确地解释指针的迭代器

时间:2012-11-13 12:09:29

标签: c++ vector iterator dereference

我有一个指向对象的向量。每个对象都存储一个值,并具有一个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();
}

最终编辑:好吧,问题原来是一个没有正确初始化指针的borked构造函数,所以我根据实际问题的位置做了解决。 :)

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);
}

2 个答案:

答案 0 :(得分:2)

你的toSting()有问题。改变

ss <<*(this)->value;

ss << value;

答案 1 :(得分:0)

编辑:这不是错误,而是使用迭代器时的一般建议。请勿使用<检查结尾,请使用!=

iter < input.end()

应该是这样的:

iter != input.end()

这是因为对于某些容器,&lt;经营者不会做你期望的。因此,在某些时候你可能会取消引用input.end()本身,它本身就什么都没有。