今天在寫一個搜索引擎的分詞系統,是很簡單的那種,但是居然費了我一天的時間還沒完成,晚上估計還得弄一會了,但是在這個過程中,遇到了集中關於字符串數組的操作,值得和大家分享一下。
首先是關於統計字符串數組元素的個數:
字符串數組不同於整型數組,每一個字符串所占的空間是不一樣的,不能用sizeof簡單的計算出來。下面是示例代碼:
#include <iostream> #include <string> using namespace std; int main() { string str[] = {"abfafawfefw","defg","32121","Miss","11111"}; cout << sizeof(str) / sizeof(str[0]); return 0; }
字符串數組存取方式采用了對齊原則,占用空間少的向占用空間多的靠齊,首先使用sizeof(str)首先獲得所用的所用字節數,使用sizeof(str[0])再計算數組中一個元素平均占用的字節數。然后除一下,就是元素個數,但是注意,被除的那個元素應該是所占空間最大的那個。
然后是關於統計字符串數組各個元素出現的次數:
這個是我用在統計分詞后得到的詞組各自的頻次的,但是不知道出了什么問題,一直實現不了,雖然我知道這個確實是很簡單的一個問題。
我通過大百度找到了一種統計次數的方法,他是統計整型數組的,但是感覺很不錯,但是我暫時還沒有驗證,先貼出來吧:
#include<stdio.h> #include<stdlib.h> main() { int a[100],b[100],c[100]={0},i,j; //a數組放隨機數 //b數組放是否被統計的標志,1未統計,0已統計 //c數組放對應a數組中隨機數出現的次數 for(i=0;i<100;i++) { a[i]=rand()()%21;//產生0~20的隨機數 b[i]=1;//未統計 printf("%5d",a[i]); //打印a數組的值 if((i+1)%10==0) //一行打印10個數 printf("\n"); } printf("\n"); for(i=0;i<100;i++) { if(b[i]) //若a[i]未被統計 { c[i]++; //次數加1 for(j=i+1;j<100;j++)//從下一個開始向后查找 if(a[j]==a[i]) //若相等 { c[i]++; //則次數增1 b[j]=0; //改為已統計 } } } for(i=0,j=1;i<100;i++) { if(c[i]) //若某隨機數出現了,則打印其值和出現次數 printf("%3d:%5d 出現 %3d次\n",j++,a[i],c[i]); } }
他用了一個統計標志,這個很適合我現在的這個問題,也希望能對大家有用吧,謝謝了。
下面是CSDN上一個很不錯的關於C++的各類總結,這個鏈接是字符串的。
