实现这个简单的程序我在运行时发现了当我在 FIRST 结束时键入eof时发生的错误。错误说“ vector iterator not dereferencable ”。那可能吗?迭代器在while周期后声明!我仍然无法理解我拼错了什么。有人能帮我吗? PS。程序应检查向量是否是另一个的前缀。谢谢!这是主要功能:
int main(){
vector<int> v1, v2;
cout << "1st vector: enter integers" << endl;
int i, j;
while (cin >> i){
v1.push_back(i);
}
cout << "2nd vector: enter integers" << endl;
while (cin >> j){
v2.push_back(j);
}
vector<int>::const_iterator i1 = v1.begin();
vector<int>::const_iterator i2 = v2.begin();
while ((*i1) && (*i2) && ((*i1) == (*i2))){
++i1; ++i2;
}
if ((*i1) && (*i2))
cout << "Vectors not compatible." << endl;
else
if (!(*i1))
cout << "The 1st vector is a prefix for the 2nd." << endl;
else
cout << "The 2nd vector is a prefix for the 1st." << endl;
return 0;
}
答案 0 :(得分:1)
vector<int>
不是以null结尾的c样式字符串。因此,要检查迭代器是否到达结尾,您需要将它与结束迭代器进行比较。因此,在这两种情况下,您应该编写(*i1) && (*i2)
而不是(i1 != v1.end()) && (i2 != v2.end())
。同样适用于!(*i1)
。您应该将其更改为i1 == v1.end()
。
@RSahu描述了你遇到的第一个问题。修复第一个问题后,您将遇到我所描述的问题。
要解决他描述的问题,你应该清除坏位并忽略cin
缓冲区中剩下的内容。在第二个while
循环之前添加以下行:
cin.clear();
cin.ignore();
答案 1 :(得分:0)
在cin
上获得第一个eof后,它就会停留在那里。第二个while循环实际上变成了noop,因为cin
认为它已经完成了。从那里,我们经历:
vector<int>::const_iterator i1 = v1.begin();
vector<int>::const_iterator i2 = v2.begin();
while ((*i1) && (*i2) && ((*i1) == (*i2))){
^^^
UB!
您在不检查i2
的尺寸的情况下取消引用v2
。
首先,您必须清除std::cin
:
std::cin.clear();
然后,检查你是否使用向量的正确方法是将迭代器与end()
进行比较(而不是简单地解除引用):
while (i1 < v1.end() && i2 < v2.end() && *i1 == *i2) {
++i1;
++i2;
}
虽然如果您可以访问C ++ 14编译器,但可以使用std::mismatch
:
auto res = std::mismatch(v1.begin(), v1.end(), v2.begin(), v2.end());
if (res.first < v1.end()) {
if (res.second < v2.end()) {
std::cout << "Not compatible!" << std::endl;
}
else {
std::cout << "The 2nd vector is a prefix for the 1st." << std::endl;
}
}
else {
std::cout << "The 1st vector is a prefix for the 2nd." << std::endl;
}
答案 2 :(得分:0)
以下栏目:
while (cin >> i){
v1.push_back(i);
}
确保cin >> j
失败。因此,没有任何内容添加到块中的v2
:
while (cin >> j){
v2.push_back(j);
}
由于v2
为空,因此使用*i2
会导致未定义的行为。