微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

检查 std::vector<const char *> 是否包含作为 const char * 给出的字符序列

如何解决检查 std::vector<const char *> 是否包含作为 const char * 给出的字符序列

当我声明 std::vector<std::string> v 时,我可以轻松检查它是否包含给定的字符序列

if ( std::find( v.begin(),v.end(),"abc" ) != v.end() )
{
    // some logic if contains
}

但是如果我使用 std::vector<const char*> v 并尝试应用相同的逻辑来查找给定的字符序列,我的代码将无法正常工作。

是什么导致了这个问题?我该如何解决这个问题?

编辑

最快的解决方案(我关心性能,这就是我拒绝std::string的原因)

bool FindStringInArray( const DynamicArray<const char*>& array,const char* pStr )
{
    return ( std::find_if( array.cbegin(),array.cend(),[&]( const char* p ) 
            { return strcmp( p,pStr ) == 0; } ) != array.cend() ) ? true : false;
}

解决方法

使用 std::vector<const char*> 来存储字符串是有问题的。在您的代码中,您比较了指针,但这是行不通的。

请注意,std::find 是基于要找到的值类型的模板,并且该类型不一定是容器元素的类型。此外,还有一个 operator== 来比较 const char*std::string。因此,您可以像这样使用 find:

if ( std::find( v.begin(),v.end(),std::string("abc") ) != v.end() )
{
    // some logic if contains
}
,

除此之外,c++17 引入了 std::string_view,它是 const char* 的精简包装器,并正确重载了运算符。旨在成为 const char*

的“现代 C++”替代品
std::vector<std::string_view> v;
if ( std::find( v.begin(),"abc" ) != v.end() )
{
    // some logic if contains
}

,

std::find 调用 operator==,它对于 const char * 被定义为比较指针值,而不是内容。 (毕竟,谁说被指向的东西是字符串?它可以是单个字符,甚至是指向数组的最后一个指针。)

您必须将 strcmpstd::find_if 一起使用或手动迭代向量。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。