2012-03-07 166 views
2
void insert_string(std::vector<std::string> & strings, const std::string &s) 
{ 

    std::vector<std::string>::iterator it=lower_bound(strings.begin(),strings.end(),s); 
    if(strings.size()>0) std::cout<<*it<<" is found\n"; // **** 
    strings.insert(it,s); 
} 

当试图使用此功能时,第一次插入会很好。第二次插入将输出“找到[firststring]”,然后segfault。如果我注释掉if/cout行,我可以重复调用并且不会发生段错误。C++:为什么取消引用这个向量迭代器段错误?

我也试过做一些像std::string tmp=*it;那样会在那条线上发生段错误。虽然打印并不是什么大问题,但我真正想要做的是检查lower_bound找到的位置上的字符串是否与尝试插入的字符串相同(即,if(*it==s),它是像段以上两个例子)。

我在这里错过了什么?

谢谢!

+1

当然你的意思是if(it!= strings.end())std :: cout << * it <<“找到了\ n”;'? – Flexo 2012-03-07 09:20:30

+0

对不起,我不应该使用“找到”一词;我只是想打印迭代器的价值是什么,而不是试图暗示字符串's'实际上是在这个向量中找到的(尽管这最终是我想要做的)。 – Joseph 2012-03-07 09:21:56

回答

6

检查条件是否it == strings.end(),如果它不打印它。这可能会导致问题。你确定你想要检查的字符串是在字符串的矢量吗?

+1

啊,这正是问题所在。在插入时,我不知道新字符串是否已经在字符串向量中;实际上,如果是这样,我不想添加它。添加一个检查,看看迭代器是否是向量的末尾解决了我的问题。谢谢! – Joseph 2012-03-07 09:26:09