2015-05-04 37 views
0

我想检查一个字符串是否是严格的另一个字符串的子集。 对于为此我用boost::contains,我比较字符串的大小,如下所示:如何检查字符串是否是另一个字符串的一个子集

#include <boost/algorithm/string.hpp> 
#include <iostream> 

using namespace std; 
using namespace boost::algorithm; 

int main() 
{ 
    string str1 = "abc news"; 
    string str2 = "abc"; 
    //strim strings using boost 
    trim(str1); 
    trim(str2); 
    //if str2 is a subset of str1 and its size is less than the size of str1 then it is strictly contained in str1 
    if(contains(str1,str2) && (str2.size() < str1.size())) 
    { 
    cout <<"contains" << end; 
    } 
    return 0; 
} 

有没有更好的办法来解决这个问题呢?而不是比较字符串的大小?


  • ABCABC新闻
  • ABC的适当子集并不的的适当子集ABC

+1

为什么不直接使用'的std :: string :: find'? – Lingxi

+0

是否与正确的子集类似? –

+3

我会反转测试(即在*调用'contains()'之前检查大小*),除此之外,我认为你不能做得更好。 – Nim

回答

3

你可以只使用==!=比较字符串:

if(contains(str1, str2) && (str1 != str2)) 
    ... 

如果字符串包含一个字符串,两者不相等,你有一个真正的子集。

如果这比你的方法更适合你决定。它的输入较少,非常清晰(IMO),但如果两个字符串都长且相等,或者两者都以相同的长序列开始,则可能会稍微慢一些。

注意:如果您真的关心性能,您可能需要尝试Boyer-Moore搜索和Boyer-Moore-Horspool搜索。它们比任何简单的字符串搜索都快(正如在stdlibC++中的字符串搜索中使用的那样,请参阅here),我不知道boost::contains是否使用它们。

+1

比较长度会更有效。 – tenfour

+0

@tenfour确实。但对于像“ABC新闻”这样的字符串来说,绝对不重要。 –

+1

但你不知道字符串是什么。这可能是莎士比亚的作品! :) – Galik

1

关于比较操作

TL; DR:确定您正在比较的格式。

请谨慎对待您如何定义

例如,你没有指出放入系统的问题是你的问题,但如果我提出假设:

"ABC  " //IE whitespaces 
"ABC\n" 

你怎么看它?你接受与否?如果不这样做,你就必须要么trim或比较之前清理你的输出 - 在comparaison操作只是一般的音符 -

无论如何,Baum pointed out,你可以使用==或你要么检查字符串平等可以用size()length()来比较长度(假设您首先检查子字符串会更有效);

+0

是的,这是非常重要的mekap。我不得不提到它。我在做比较之前实际上修整了字符串 –

+0

@HaniGoc是的,我为那些点击这个页面的人写了这个答案,要小心在实际比较之前要做什么操作。 – Mekap

4

我会用以下内容:

bool is_substr_of(const std::string& sub, const std::string& s) { 
    return sub.size() < s.size() && s.find(sub) != s.npos; 
} 

这仅使用标准库,和第一确实大小检查比s.find(sub) != s.npos便宜。

+1

我没有得到downvote - 这是正确的。 – Nim

+0

不知道downvote。这个答案只使用标准库,并且不会浪费时间比较字符串。 – Galik

0

另一种方法,只使用标准库:

#include <algorithm> 
#include <string> 
#include <iostream> 

using namespace std; 

int main() 
{ 
    string str1 = "abc news"; 
    string str2 = "abc"; 
    if (str2 != str1 
    && search(begin(str1), end(str1), 
       begin(str2), end(str2)) != end(str1)) 
    { 
    cout <<"contains" << endl; 
    } 
    return 0; 
} 
+1

'std :: string :: find'看起来更整齐。 – Lingxi

+0

这是另一种方式,你是对的。 std :: search的优点是搜索字符串可以是任何由2个迭代器限定的序列。 –

相关问题