为什么迭代器不兼容?

时间:2016-09-29 14:34:51

标签: c++ vector iterator

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <algorithm>
#include <string> 
#include <iomanip>
using namespace std;

vector<string>::iterator findString(vector<string> word, string x)
{
auto beg = word.begin();
for ( ; beg != word.end() && x != *beg; beg++);
return beg;
}

vector<int>::iterator convert(vector<string>::iterator &t, vector<string> &word, vector<int> &amount)
{
vector<int>::iterator count = amount.begin();
vector<string>::iterator beg = word.begin();
for (; beg != word.end() && beg != t; count++, beg++);
return count;
}
int main()
{
vector<string> word;
vector<int> amount;

string x;

cout << "Please enter words list:" << endl;

cin >> x;
word.push_back(x);
amount.push_back(1);

while (cin >> x)
{
        vector<string>::iterator t = findString(word, x);

        if (t != word.end()) //A: Error happens in this line.
        {
            vector<int>::iterator i = convert(t,word,amount);
            (*i) ++;
        }
        else
        {
            word.push_back(x);
            amount.push_back(1);
        }
}

for (auto r : word)
    cout << setw(4) << r;
cout << endl;

for (auto r : amount)
    cout << setw(4) << r;
cout << endl;

return 0;
}

在这个程序中,我想计算每个单词输入的数量。 我写了一个从字符串迭代器到int迭代器的转换函数。但它仍然无法工作,并说迭代器不兼容。有什么不对?而且,我很困惑为什么迭代器不能转换成相应的整数。为什么有ptrdiff_t&#39;如果它只是&#39; int&#39;? 这是我第一次使用这个网站。如果有人能回答我的问题,我将不胜感激。感谢。

- 在输入两个字符串后出现运行时错误。调试断言失败。文件:vector,line 248.表达式:矢量迭代器不兼容。我在VS2015上运行它。

- 错误发生在A行。

我终于明白了。感谢大家。非常感谢你,祝愿你们过得愉快!

2 个答案:

答案 0 :(得分:1)

您的错误与字符串,整数或转化无关。这是因为您每次调用vector<string> word时都会创建findString的新副本,因此其返回的迭代器是不同向量的迭代器(它是一个&#39; s迭代器成副本)。你有:

vector<string>::iterator findString(vector<string> word, string x)
{
    ...
}

然后,错误在哪里:

vector<string>::iterator t = findString(word, x);

if (t != word.end()) //A: Error happens in this line.

因此findString将迭代器返回到单词的副本而不是单词本身,并且MS&#39;当你试图将它与来自不同向量的迭代器进行比较时,向量实现有一个断言失败,因为它认为你很可能犯了一个错误。而是通过引用传递您的向量,例如:

vector<string>::iterator findString(vector<string> & word, string x)
{
    ...
}

请注意,单词现在通过引用传递,因此不会被复制。

也就是说,当然,您应首先将错误修复为练习,但在您自己的代码有效后,请考虑将findString替换为std::find(因为它已经存在) )。此外,您似乎可以使用map<string,int>来维护字数,从而大大简化您的代码。还有其他一些事情。

答案 1 :(得分:0)

这两种类型完全不同,无法将其转换为另一种。它们不是&#34;整数&#34;,它们抽象容器中的位置。

我认为您看到的实际问题是因为您的findString正在返回相对于您的单词向量的副本的迭代器。当您将迭代器与word.end()进行比较时,两个迭代器相对于不同的容器,并且VC STL正确地抱怨。通过引用接受向量作为开始。