使用std :: string对象boost :: ifind_first

时间:2009-08-10 16:39:22

标签: c++ algorithm string boost

我正在尝试使用提升字符串算法进行不区分大小写的搜索 总新手在这里。

如果我这样使用它,我会收到错误。

std::string str1("Hello world");
std::string str2("hello");
if ( boost::ifind_first(str1, str2) ) some code;

转换为char指针可以解决问题。

boost::ifind_first( (char*)str1.c_str(), (char*)str2.c_str() );

有没有办法直接搜索std :: string对象?

另外,也许还有另一种方法可以知道字符串是否存在于另一个字符串中且不区分大小写的搜索?

3 个答案:

答案 0 :(得分:12)

您需要使用boost :: iterator_range。这有效:

  typedef const boost::iterator_range<std::string::const_iterator> StringRange;
  std::string str1("Hello world");
  std::string str2("hello");

  if ( boost::ifind_first(
          StringRange(str1.begin(), str1.end()),
          StringRange(str2.begin(), str2.end()) ) )
      std::cout << "Found!" << std::endl;

编辑:在typedef中使用const iterator_range允许传递临时范围。

答案 1 :(得分:0)

这样的事情会对字符串进行不区分大小写的比较而不修改任何字符串。

int nocase_cmp(const string & s1, const string& s2) 
{
  string::const_iterator it1=s1.begin();
  string::const_iterator it2=s2.begin();

  //stop when either string's end has been reached
  while ( (it1!=s1.end()) && (it2!=s2.end()) ) 
  { 
    if(::toupper(*it1) != ::toupper(*it2)) //letters differ?
     // return -1 to indicate smaller than, 1 otherwise
     return (::toupper(*it1)  < ::toupper(*it2)) ? -1 : 1; 
    //proceed to the next character in each string
    ++it1;
    ++it2;
  }
  size_t size1=s1.size(), size2=s2.size();// cache lengths
  //return -1,0 or 1 according to strings' lengths
  if (size1==size2)  {
    return 0;
  }
  return (size1<size2) ? -1 : 1;
}

答案 2 :(得分:0)

(char*)str.c_str()实际上正在执行const_castconst_cast<char*>(str.c_str())。我非常怀疑为了搜索字符串而必须抛弃const

我从未使用过boost::ifind_first,但根据documentation,该函数有两个范围。我想有一种方法可以从字符串创建一个范围? OTOH,我想知道弦是不是一个完美的范围。

如果您发布所用编译器的完整错误消息可能会有所帮助。