c++ - 为什么迭代器不兼容?

标签 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;
}

在这个程序中,我想计算每个单词输入的数量。 我写了一个从字符串迭代器到整数迭代器的转换函数。但它仍然不起作用,并表示迭代器不兼容。有什么不对?此外,我很困惑为什么不能将迭代器转换为相应的整数。为什么会有'ptrdiff_t',如果它只是'int'会不会更容易? 这是我第一次使用这个网站。如果有人能回答我的问题,我将不胜感激。谢谢。

- 这是一个运行时错误,在输入两个字符串之后。调试断言失败。文件: vector ,第 248 行。表达式: vector 迭代器不兼容。我在 VS2015 上运行它。

-A行出现错误

我终于明白了。感谢大家。非常感谢,祝大家有美好的一天!

最佳答案

您的错误与字符串、整数或转换无关。这是因为您正在创建 vector<string> word 的新拷贝每次打电话findString ,所以它返回的迭代器是另一个 vector 的迭代器(它是一个拷贝的迭代器)。你有:

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正在将迭代器返回到 word 的拷贝而不是 word 本身,并且当您尝试将它与来自不同 vector 的迭代器进行比较时,MS 的 vector 实现有一个断言失败,因为它认为您很可能犯了一个错误。而是通过引用传递 vector ,例如:

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

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

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

关于c++ - 为什么迭代器不兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39773225/

相关文章:

c++ - 信号的总能量

c++ - remove_if 基于带有仿函数的 vector 索引

c++ - istream_iterator eos

c++ - 在 std::string ERROR: Expression: string subscript out of range 中找到最后一个字符

c++ - 在 C++ 中使用引用而不是指针有什么好处吗?

python - 替代 tkinter.dooneevent

C++ vector 插入新对象

c++ - 从格式化文件创建 std::vector

c++ - 使用 C++ 迭代器从文件中读取列表?

C++ 迭代 vector 返回甚至不在 vector 中的对象