检查 std::vector<const char *> 是否包含以 const char * 形式给出的字符序列
Check if std::vector<const char *> contains character sequence given as 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::find
调用 operator==
,const char *
定义为比较指针值,而不是内容。 (毕竟,谁说指向的东西是字符串?它可以是单个字符,甚至可以是指向数组的最后一个指针。)
您必须将 strcmp
与 std::find_if
一起使用或手动迭代向量。
使用std::vector<const char*>
来存储字符串是有问题的。在你的代码中你比较指针,那是行不通的。
请注意,std::find
是根据要查找的值的类型模板化的,该类型不一定是容器元素的类型。此外还有一个 operator==
来比较 const char*
和 std::string
。因此你可以像这样使用查找:
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(), v.end(), "abc" ) != v.end() )
{
// some logic if contains
}
当我声明 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::find
调用 operator==
,const char *
定义为比较指针值,而不是内容。 (毕竟,谁说指向的东西是字符串?它可以是单个字符,甚至可以是指向数组的最后一个指针。)
您必须将 strcmp
与 std::find_if
一起使用或手动迭代向量。
使用std::vector<const char*>
来存储字符串是有问题的。在你的代码中你比较指针,那是行不通的。
请注意,std::find
是根据要查找的值的类型模板化的,该类型不一定是容器元素的类型。此外还有一个 operator==
来比较 const char*
和 std::string
。因此你可以像这样使用查找:
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(), v.end(), "abc" ) != v.end() )
{
// some logic if contains
}