为什么迭代器不兼容
Why are the iterators not compatible?
#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'不是更容易吗?这是我第一次使用这个网站。如果有人能回答我的问题,我会很感激。谢谢。
-在输入两个字符串后出现运行时错误。调试断言失败。文件:向量,第248行。表达式:vector迭代器不兼容。我在VS2015上运行它。
- a行出错
我终于明白了。谢谢每一个人。非常感谢大家,祝大家度过美好的一天!你的错误与字符串或整型或转换没有任何关系。这是因为每次调用findString
时,你都创建了vector<string> word
的一个新副本,所以它返回的迭代器是一个不同向量的迭代器(它是一个副本的迭代器)。你有:
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本身,当您尝试将MS的vector实现与来自其他vector的迭代器进行比较时,它会出现断言失败,因为它认为您很可能犯了错误。相反,通过引用传递向量,例如:
vector<string>::iterator findString(vector<string> & word, string x)
{
...
}
注意word现在是通过引用传递的,因此不会被复制。
也就是说,您应该首先作为练习修复您的错误,当然,但是在您自己的代码工作之后,请考虑用std::find
替换findString
(因为它已经存在)。此外,似乎可以通过使用map<string,int>
来维护单词计数,从而大大简化代码。还有一些其他的东西
这两种类型完全不同,不能相互转换。它们不是"整数",它们抽象了容器中的位置。
我认为你看到的实际问题是因为你的findString
返回了一个相对于你的words vector的副本的迭代器。当您将该迭代器与word.end()
进行比较时,这两个迭代器相对于不同的容器,VC STL有理由抱怨。
- 不明白迭代器,引用和指针失效,一个例子
- 自定义 STL 兼容迭代器,用于迭代 2D 数组类的列
- 为什么某些 STL 容器(堆栈、队列、优先级队列)不支持迭代器?
- 为什么 min_element() 返回最小元素的索引,而不是迭代器?
- 我从 std::set 得到const_iterator而不是迭代器
- 为什么向量的.at()成员函数返回引用而不是迭代器
- 如果我有一个指向矢量元素的指针,而不是迭代器,如何删除它?
- 对于使用 C 样式指针矢量化的循环,但不使用迭代器
- 使用循环(而不是迭代器)从向量中删除指针
- 将指针而不是迭代器传递到std ::复制
- 如何在不使用迭代器的情况下在 C++ 中打印地图
- C++模板不接受迭代器
- 容器不可知迭代器参数
- 为什么 void* 不是迭代器类型?
- 如何在不使用迭代器的情况下访问任何向量的第 i 个元素
- 为什么在达到容量后在向量中插入时,C++不处理迭代器?
- 我可以用cout而不是迭代器循环打印STL映射吗?
- 为什么 std::bitset 不附带迭代器?
- 字符串::擦除不接受迭代器?
- 是否有一个标准容器允许在不使迭代器无效的情况下插入元素