检查 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 * 定义为比较指针值,而不是内容。 (毕竟,谁说指向的东西是字符串?它可以是单个字符,甚至可以是指向数组的最后一个指针。)

您必须将 strcmpstd::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
}