std :: find类型T ** vs T * [N]

时间:2012-02-09 02:37:56

标签: stl find command-line-arguments c++

我更喜欢与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 World
  找不到字符串
  找到的字符串:您好

感谢。

2 个答案:

答案 0 :(得分:1)

比较char const*金额的类型以指向地址。 "Hello"的地址保证不同,除非您将其与字符串文字"Hello"的另一个地址进行比较(在这种情况下,指针可能比较相等)。您的compare()函数会比较指向的字符。

答案 1 :(得分:1)

在第一种情况下,您要比较指针值本身而不是它们指向的内容。常量“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");

产生正确的结果

相关问题