1.bsearch 用法
2.C++中如何在类模板外定义函数
bsearch 用法
c函数qsort()和bsearch()的函函数用法
使用qsort()排序 并 用 bsearch()搜索是一个比较常用的组合,使用方便快捷。数源
qsort 的函函数函数原型是void __cdecl qsort ( void *base, size_t num, size_t width, int (__cdecl *comp)(const void *, const void* ) )
其中base是排序的一个集合数组,num是数源yii ar 源码这个数组元素的个数,width是函函数一个元素的大小,comp是数源邻里互动源码一个比较函数。
比如:对一个长为的函函数数组进行排序时,int a[]; 那么base应为a,数源num应为 ,函函数width应为 sizeof(int),数源comp函数随自己的函函数命名。
qsort(a,数源,sizeof(int ),comp);
其中comp函数应写为:
int comp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}
是对一个二维数组的进行排序:
int a[][2]; 其中按照a[i][0]的大小进行一个整体的排序,其中a[i][1]必须和a[i][0]一起移动交换。函函数商品转售源码
qsort(a,数源,sizeof(int)*2,comp);
int comp(const void *a,const void *b)
{
return ((int *)a)[0]-((int *)b)[0];
}
对字符串进行一个排序:
char a[][];
qsort(a,,sizeof(char)*,comp);
int comp(const void *a,const void *b
{
return strcmp((char *)a,(char *)b);
}
对一个结构体进行排序:
typedef struct str
{
char str1[];
char str2[];
}str,*stri;
str strin[]={ 0};
int compare(const void *a,const void *b)
{
return strcmp( ((str*)a)->str2 , ((str*)b)->str2 );
}
qsort(strin,total,sizeof(str),compare);
而关于bsearch() ,他和qsort的用法基本一样,只是函函数他的返回值是一个指向找到的单位元素的一个指针,另外他多了一个参数,祭奠恶搞源码是一个指向查找元素的一个指针。
比如:从上面例子中的结构体数组中查找一个字符串:
str *locate;
char buffer[]="abc";
locate=(str*)bsearch(buffer,strin,total,sizeof(str),com);
int com(const void *a,const void *b)
{
return strcmp( (char*)a, ((str*)b)->str2 );
}
可以大致比较两个函数的类似和差别。
例题:pku
此题还应注意的mdm签名源码地方是字典输入的结束设置,希望能提出更好的解决方法(测试通过后再告诉我)。
例题源代码:
#include<iostream>
#include<cstring>
using namespace std;
typedef struct str{
char s1[];
char s2[];
}str,*stri;
str s[];
int cmp(const void *a,const void *b){
return strcmp( ((str *)a)->s2 , ((str *)b)->s2 );
}
int compare(const void *a,const void *b){
return strcmp((char*)a,((str*)b)->s2);
}
int main(){
int n=0;
char tt[];
while(1){
gets(tt);
if(strlen(tt)==0)break;
int i=0,j=0;
for(;tt[i]!=' ';i++)s[n].s1[i]=tt[i];
s[n].s1[i]='\0';
for(i++;tt[i]!='\0';i++,j++)s[n].s2[j]=tt[i];
s[n].s2[j]='\0';
n++;
}
qsort(s,n,sizeof(str),cmp);
while(scanf("%s",tt)!=EOF){
str * pItem;
pItem = (str *)bsearch (tt, s, n, sizeof (str), compare);
if(pItem!=NULL)
puts(pItem->s1);
else printf("eh\n");
}
return 0;
}
[size=4]
C++中如何在类模板外定义函数
是想定义在源文件吗?
1.这是不允许的,因为模板类的成员函数的定义,是一种不完整的定义.
2.由于编译器不知道模板参数的具体类型,无法为其成员函数生成代码.
3.编译器在成员函数的调用处,才最终知道如何生成代码.
总之,模板类的成员函数的定义不能像普通类的成员函数一样,定义在源代码中,而只能定义在头文件中.
如果想定义在头文件中的模板类以外,倒是可以做到,如下:
template<class numtype>
Compare<numtype>::Compare(numtype a,numtype b){
x = a;
y = b;
}
template<class numtype>
numtype Compare<numtype>::max(){
return (x>y)? x:y;
}
template<class numtype>
numtype Compare<numtype>::min(){
return (x<y)? x:y;
}