如何解决检查 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*
std::vector<std::string_view> v;
if ( std::find( v.begin(),"abc" ) != v.end() )
{
// some logic if contains
}
,
std::find
调用 operator==
,它对于 const char *
被定义为比较指针值,而不是内容。 (毕竟,谁说被指向的东西是字符串?它可以是单个字符,甚至是指向数组的最后一个指针。)
您必须将 strcmp
与 std::find_if
一起使用或手动迭代向量。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。