首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字符串向量上的迭代器,作为控制台的输入,给出分段错误

字符串向量上的迭代器,作为控制台的输入,给出分段错误
EN

Stack Overflow用户
提问于 2016-01-07 15:00:04
回答 1查看 38关注 0票数 1

我这里有两个不同的程序,它们都创建了一个字符串的BST,然后检查给定的字符串是否在BST中。

当我将字符串向量的迭代器的解引用传递给find函数时,第一个程序运行得很好。

但是第二个程序失败了,当我从用户获取输入,然后在输入字符串的向量上传递迭代器的解引用时,第二个程序会失败并给出分割错误。

为什么当我收到用户的输入时,它会失败?

工作计划

代码语言:javascript
复制
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <set>
#include<typeinfo>
using namespace std;

int main() 
{

    vector<std::string> vn;
    set<std::string> names;
    BST<std::string> b2;

    vn.push_back("AAA");
    vn.push_back("BBB");
    vn.push_back("CCC");

    vector<std::string>::iterator vit = vn.begin();
    for(; vit != vn.end(); vit++)
    {
         b2.insert(*vit);
         names.insert(*vit);
    }

    vit = vn.begin();
    for(; vit != vn.end(); ++vit) 
    {
         if(*(b2.find(*vit)) != *vit) 
         {
              cout << "Incorrect return value when finding " << *vit;
              return -1;
         }
    }
}

提供程序时出错

代码语言:javascript
复制
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <set>
#include<typeinfo>
using namespace std;

int main() 
{

    vector<std::string> vn;
    set<std::string> names;
    std::string cur_str;
    BST<std::string> b2;

    vn.push_back("AAA");
    vn.push_back("BBB");
    vn.push_back("CCC");


    vector<std::string>::iterator vit = vn.begin();
    for(; vit != vn.end(); vit++)
    {
         b2.insert(*vit);
         names.insert(*vit);
    }

    std::getline(std::cin, cur_str);
    vector<std::string> vn2;
    vn2.push_back(cur_str);
    vector<std::string>::iterator vit2 = vn2.begin();

    vit = vn.begin();
    for(; vit != vn.end(); ++vit) 
    {
         if(*(b2.find(*vit2)) != *vit) (gives segmentation fault in this line)
         {
              cout << "Incorrect return value when finding " << *vit << endl;
              return -1;
         }
    }
}

查找函数

代码语言:javascript
复制
template<typename Data> (Declared at the beginning)
iterator find(const Data& item) const
{
    BSTNode<Data> * currentNode = root;
    while(NULL != currentNode) 
    {
        if(item < currentNode->data) 
        {
            currentNode = currentNode->left;
        }
        else if(currentNode->data < item)
        {
            currentNode = currentNode->right;
        }
        else 
        {
             // item == currentNode->data
             return iterator(currentNode);
        }
    }
return end();
 }
EN

回答 1

Stack Overflow用户

发布于 2016-01-07 15:15:52

代码语言:javascript
复制
     if(*(b2.find(*vit2)) != *vit) (gives segmentation fault in this line)

这错误地处理了find找不到任何东西的情况。如果没有找到该值,find将返回一个迭代器,该迭代器指向容器末尾之后的1,然后对其应用*。糟了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34649106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档