【问题标题】:Applying c++ "lower_bound" on an array of char strings在字符字符串数组上应用 c++“lower_bound”
【发布时间】:2015-03-02 19:17:34
【问题描述】:

我正在尝试 C++ 中的 lower_bound 函数。 一维数据类型多次使用它。

现在,我在sorted array dict[5000][20] 上尝试查找size <=20 的字符串。 要匹配的字符串在str中。

bool recurseSerialNum(char *name,int s,int l,char (*keypad)[3],string str,char (*dict)[20],int 
dictlen)

{


    char (*idx)[20]= lower_bound(&dict[0],&dict[0]+dictlen,str.c_str());

    int tmp=idx-dict;

    if(tmp!=dictlen)
        printf("%s\n",*idx);

}

根据http://www.cplusplus.com/reference/algorithm/lower_bound/?kw=lower_bound,如果找不到匹配项,该函数应该返回'last'(超出结尾)的索引,即tmp 应该等于dictlen。 在我的情况下,它总是返回开始索引,即我得到tmp equal to 0 1. 当传递一个在dict 中存在的字符串时,2. 当传递一个在dict 中不存在的字符串时。

我认为问题在于指针的处理和传递。 default comparator 应该在这种情况下可用,就像在向量的情况下可用一样。我也试过传递一个明确的,但无济于事。

我试过这个比较器 -

bool compStr(const char *a, const char *b){
    return strcmp(a,b)<0;
}

我知道ALTERNATE 是使用矢量等,但我想知道这个问题。 通过 google 和 SO 对此进行了搜索,但没有找到类似的内容。

【问题讨论】:

  • 指针的默认比较器比较指针。要比较字符串,您需要自己的比较器[](char* lhs, char* rhs) { return strcmp(lhs, rhs) &lt; 0; }
  • @zch - 我已在我使用的比较器上方添加。它不起作用。此外,我不太了解您所指的比较器的语法。请,如果你能详细说明 "[](char* lhs, char* rhs) { return strcmp(lhs, rhs)
  • 这是用于匿名函子的 C++11 语法,称为 lambda expression。在 C++03 中等效的是一个类 struct StrCmp { bool operator()(...){...} }; 并将 StrCmp() 作为 comp 参数传递。

标签: c++ string pointers multidimensional-array lower-bound


【解决方案1】:

我相信这里有两个误解。

  1. std::lower_bound 不检查元素是否是排序范围的一部分。相反,它会在不破坏顺序的情况下找到可以插入元素的最左侧位置。
  2. 您不是在比较字符串的内容,而是比较它们的内存地址。

确实,在您的情况下,dict 是一个排序范围,因为内部数组的内存地址是升序的。当然,与str.c_str() 谎言相关的地方是未定义的。在实践中,dict 是一个堆栈对象,您经常会发现堆的内存范围(str.c_str() 总是位于)低于堆栈的范围,在这种情况下,lower_bound 非常正确地告诉您,如果您想要将此地址插入到您解释为dict 的地址排序范围中,您必须在开始时这样做。

对于一个解决方案,因为有一个operator&lt;(char const *, std::string const &amp;),你可以简单地写

char (*idx)[20] = lower_bound(&dict[0], &dict[0] + dictlen, str);

...但是您是否真的在寻找std::find

【讨论】:

  • 我明白了以上内容。感谢您的解决方案,但应该有一种重载比较器的方法来完成比较字符串而不是地址的任务。请,如果可以的话!
  • 如果你以后写lower_bound(&amp;dict[0], &amp;dict[0] + dictlen, str.c_str(), compStr),它应该与你编辑的比较器一起工作。
  • 是的,你是对的!有用。我之前一定做了什么傻事。无论如何,因此外卖课程是“char *”将被视为一个 int(指针存储地址),除非由显式比较器指示。是这样吗?
  • 不是int,就像char*。如果没有比较器,lower_bound 将使用 operator&lt;operator&lt; 指针比较它们指向的地址,而不是这些地址的值。
猜你喜欢
  • 2016-03-05
  • 1970-01-01
  • 2014-10-18
  • 2020-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多