1 void CMy0713Dlg::OnBnClickedButton1() 2 { 3 vecstduent stds; 4 CString str; 5 str.Format("张三"); 6 CStudent *pStd1 = new CStudent(str); 7 str.Format("李四"); 8 CStudent *pStd2 = new CStudent(str); 9 str.Format("王五"); 10 CStudent *pStd3 = new CStudent(str); 11 12 stds.push_back(pStd1); 13 stds.push_back(pStd2); 14 stds.push_back(pStd3); 15 int ans = get_stds(stds,"张"); 16 17 18 } 19 20 UINT CMy0713Dlg::get_stds(vecstduent &stds,char*k) 21 { 22 int ans = 0;//符合k的个数 23 CStudent* temp = NULL; // 用来交换的临时数 24 //冒泡排序 25 for (int i = 0; i < stds.size() -1 ; i++) 26 { 27 for (int j = stds.size() - 1; j > i; j--) 28 { 29 30 if (stds[j - 1]->m_strName > stds[j]->m_strName) 31 { 32 temp = stds[j - 1]; 33 stds[j - 1] = stds[j]; 34 stds[j] = temp; 35 } 36 } 37 } 38 //二分搜索 返回k的第一个索引 复杂度O(log2n) 39 auto it = stds.begin(); 40 int left = 0; 41 int right = stds.size() -1 ; 42 while(left < right) 43 { 44 int mid = (left + right) / 2; 45 int i = 0; 46 while(i < mid) 47 { 48 it ++; 49 i++; 50 } 51 if((*it)->m_strName.Compare(k) >= 0)//比较字符串 52 { 53 right = mid;//缩进右边界 54 } 55 else 56 { 57 left = mid + 1;//缩进左边界 58 } 59 if(left >= right)//防止死循环 60 { 61 if((*it)->m_strName.Compare(k) < 0) 62 it ++; 63 break; 64 } 65 it = stds.begin(); 66 } 67 68 69 70 //从索引开始遍历 直到不再符合条件 71 for(;it != stds.end();) 72 { 73 CString cstr = (*it)->m_strName; 74 if(cstr.Find(k) == 0)//如果包含 75 { 76 it = stds.erase(it); 77 m_ShowInfo.AddString(cstr); 78 ans ++; 79 } 80 else //如不包含 之后的全部舍弃 81 break; 82 } 83 84 85 //显示列表 86 for(auto it = stds.begin();it!=stds.end();it++) 87 { 88 m_ShowInfo.AddString((*it)->m_strName); 89 } 90 return ans; 91 }