std::查找类型为T**vs T*[N]

std::find with type T** vs T*[N]

本文关键字:vs 查找 std 类型      更新时间:2023-10-16

我更喜欢使用std::string,但我喜欢弄清楚这里出了什么问题。

我无法理解为什么std::find不能正确地用于类型T**,即使指针算术可以正确地用于它们。类似-

std::cout << *(argv+1) << "t" <<*(argv+2) << std::endl;

但对于类型T*[N],它运行良好。

#include <iostream>
#include <algorithm>
int main( int argc, const char ** argv )
{   
    std::cout << *(argv+1) << "t" <<*(argv+2) << std::endl;
    const char ** cmdPtr = std::find(argv+1, argv+argc, "Hello") ;
    const char * testAr[] = { "Hello", "World" };
    const char ** testPtr = std::find(testAr, testAr+2, "Hello");
    if( cmdPtr == argv+argc )
        std::cout << "String not found" << std::endl;
    if( testPtr != testAr+2 )
        std::cout << "String found: " << *testPtr << std::endl;
    return 0;
}

传递的参数:Hello World

输出:

你好世界
未找到字符串
找到字符串:Hello

谢谢。

比较char const*的类型相当于指向地址。除非您将"Hello"的地址与字符串文字"Hello"的另一个地址进行比较,否则它的地址是不同的(在这种情况下,指针可能比较相等)。compare()函数比较所指向的字符。

在第一种情况下,您比较的是指针值本身,而不是它们指向的内容。常量"Hello"的地址与argv的第一个元素的地址不同。

尝试使用:

const char ** cmdPtr = std::find(argv+1, argv+argc, std::string("Hello")) ;

std::string知道比较内容而不是地址。

对于数组版本,编译器可以将所有文字折叠成一个单独的文字,因此每次在代码中看到"Hello"时,它实际上都是同一个指针。因此,比较中的相等性

const char * testAr[] = { "Hello", "World" };
const char ** testPtr = std::find(testAr, testAr+2, "Hello");

产生正确的结果