c++处理文件,对txt进行处理,学了那么久才发现我还不会这些操作,另外c++处理文本真是快得可怕啊

  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. using namespace std;
  5. int main() {
  6. ifstream infile;
  7. infile.open("E:\\word1.txt");
  8. string s;
  9. ofstream outfile;
  10. outfile.open("E:\\word2.txt");
  11. while(getline(infile,s)) {
  12. for(int i=; s[i]; i++)
  13. if(s.substr(i,)=="n."||s.substr(i,)=="ad."||s.substr(i,)=="a."
  14. ||s.substr(i,)=="vi."||s.substr(i,)=="vt."||s.substr(i,)=="conj.") {
  15. outfile<<s.substr(,i)<<" "<<s.substr(i)<<endl;
  16. break;
  17. }
  18. }
  19. return ;
  20. }

各种调顺序,也是很有意思的,MFC也是面对对象啦

我做的课题是基于红黑树的map实现。

再列出一些自己觉得有用的吧

老师提供的宽字节转换,为了兼容汉字

  1. ifstream in(L".\\word.txt");
  2. char s[][];
  3. CString st[];
  4. while (in >> s[] >> s[]){
  5. for (int i = ; i<; i++)
  6. {
  7. int charLen = strlen(s[i]);
  8. int len = MultiByteToWideChar(CP_ACP, , s[i], charLen, NULL, );
  9. TCHAR *buf = new TCHAR[len + ];
  10. MultiByteToWideChar(CP_ACP, , s[i], charLen, buf, len);
  11. buf[len] = '\0';
  12. st[i] = buf;
  13. }
  14. dic.Insert(st[],st[]);
  15. m_num++;
  16. }

实现的时间统计。比timegettime精确地多

  1. LARGE_INTEGER large_interger;
  2. double dff;
  3. __int64 c1, c2;
  4. QueryPerformanceFrequency(&large_interger);
  5. dff = large_interger.QuadPart;
  6. QueryPerformanceCounter(&large_interger);
  7. c1 = large_interger.QuadPart;
  8. CString s2 = dic.query(s1);
  9. QueryPerformanceCounter(&large_interger);
  10. c2 = large_interger.QuadPart;

所以现在看在我实现的东西并不是很多

RBTree

  1. #define _RB_TREE_H_
  2. #include<iostream>
  3. #include<string>
  4. #include<sstream>
  5. #include<fstream>
  6. #include <time.h>
  7. using namespace std;
  8. template<class KEY, class U>
  9. class RB_Tree
  10. {
  11. private:
  12. RB_Tree(const RB_Tree& input){}
  13. const RB_Tree& operator=(const RB_Tree& input){}
  14. private:
  15. enum COLOR{ RED, BLACK };
  16. class RB_Node
  17. {
  18. public:
  19. RB_Node()
  20. {
  21. RB_COLOR = BLACK;
  22. right = NULL;
  23. left = NULL;
  24. parent = NULL;
  25. }
  26. COLOR RB_COLOR;
  27. RB_Node* right;
  28. RB_Node* left;
  29. RB_Node* parent;
  30. KEY key;
  31. U data;
  32. };
  33. public:
  34. RB_Tree()
  35. {
  36. this->m_nullNode = new RB_Node();
  37. this->m_root = m_nullNode;
  38. this->m_nullNode->right = this->m_root;
  39. this->m_nullNode->left = this->m_root;
  40. this->m_nullNode->parent = this->m_root;
  41. this->m_nullNode->RB_COLOR = BLACK;
  42. }
  43. bool Empty()
  44. {
  45. if (this->m_root == this->m_nullNode)
  46. {
  47. return true;
  48. }
  49. else
  50. {
  51. return false;
  52. }
  53. }
  54. //find node who's key equals to key,else find the insert point;
  55. RB_Node* find(KEY key)
  56. {
  57. RB_Node* index = m_root;
  58. while (index != m_nullNode)
  59. {
  60. if (key<index->key)
  61. {
  62. index = index->left;
  63. }
  64. else if (key>index->key)
  65. {
  66. index = index->right;
  67. }
  68. else
  69. {
  70. break;
  71. }
  72. }
  73. return index;
  74. }
  75. const U& RB_Tree<KEY, U>::query(const KEY& key)
  76. {
  77. RB_Node *p = find(key);
  78. if (p == NULL)
  79. return NULL;
  80. else
  81. return p->data ;
  82. }
  83. bool Insert(KEY key, U data)
  84. {
  85. RB_Node* insert_point = m_nullNode;
  86. RB_Node* index = m_root;
  87. while (index != m_nullNode)
  88. {
  89. insert_point = index;
  90. if (key<index->key)
  91. {
  92. index = index->left;
  93. }
  94. else if (key>index->key)
  95. {
  96. index = index->right;
  97. }
  98. else
  99. {
  100. return false;
  101. }
  102. }
  103. RB_Node* insert_node = new RB_Node();
  104. insert_node->key = key;
  105. insert_node->data = data;
  106. insert_node->RB_COLOR = RED;
  107. insert_node->right = m_nullNode;
  108. insert_node->left = m_nullNode;
  109. if (insert_point == m_nullNode) //empty tree
  110. {
  111. m_root = insert_node;
  112. m_root->parent = m_nullNode;
  113. m_nullNode->left = m_root;
  114. m_nullNode->right = m_root;
  115. m_nullNode->parent = m_root;
  116. }
  117. else
  118. {
  119. if (key<insert_point->key)
  120. {
  121. insert_point->left = insert_node;
  122. }
  123. else
  124. {
  125. insert_point->right = insert_node;
  126. }
  127. insert_node->parent = insert_point;
  128. }
  129. InsertFixUp(insert_node);
  130. return true;
  131. }
  132. void InsertFixUp(RB_Node* node)
  133. {
  134. while (node->parent->RB_COLOR == RED)
  135. {
  136. if (node->parent == node->parent->parent->left)
  137. {
  138. RB_Node* uncle = node->parent->parent->right;
  139. if (uncle->RB_COLOR == RED)
  140. {
  141. node->parent->RB_COLOR = BLACK;
  142. uncle->RB_COLOR = BLACK;
  143. node->parent->parent->RB_COLOR = RED;
  144. node = node->parent->parent;
  145. }
  146. else if (uncle->RB_COLOR == BLACK)
  147. {
  148. if (node == node->parent->right)
  149. {
  150. node = node->parent;
  151. RotateLeft(node);
  152. }
  153. node->parent->RB_COLOR = BLACK;
  154. node->parent->parent->RB_COLOR = RED;
  155. RotateRight(node->parent->parent);
  156. }
  157. }
  158. else
  159. {
  160. RB_Node* uncle = node->parent->parent->left;
  161. if (uncle->RB_COLOR == RED)
  162. {
  163. node->parent->RB_COLOR = BLACK;
  164. uncle->RB_COLOR = BLACK;
  165. uncle->parent->RB_COLOR = RED;
  166. node = node->parent->parent;
  167. }
  168. else if (uncle->RB_COLOR == BLACK)
  169. {
  170. if (node == node->parent->left)
  171. {
  172. node = node->parent;
  173. RotateRight(node);
  174. }
  175. else
  176. {
  177. node->parent->RB_COLOR = BLACK;
  178. node->parent->parent->RB_COLOR = RED;
  179. RotateLeft(node->parent->parent);
  180. }
  181. }
  182. }
  183. }
  184. m_root->RB_COLOR = BLACK;
  185. }
  186. bool RotateLeft(RB_Node* node)
  187. {
  188. if (node == m_nullNode || node->right == m_nullNode)
  189. {
  190. return false;//can't rotate
  191. }
  192. RB_Node* lower_right = node->right;
  193. lower_right->parent = node->parent;
  194. node->right = lower_right->left;
  195. if (lower_right->left != m_nullNode)
  196. {
  197. lower_right->left->parent = node;
  198. }
  199. if (node->parent == m_nullNode) //rotate node is root
  200. {
  201. m_root = lower_right;
  202. m_nullNode->left = m_root;
  203. m_nullNode->right = m_root;
  204. //m_nullNode->parent = m_root;
  205. }
  206. else
  207. {
  208. if (node == node->parent->left)
  209. {
  210. node->parent->left = lower_right;
  211. }
  212. else
  213. {
  214. node->parent->right = lower_right;
  215. }
  216. }
  217. node->parent = lower_right;
  218. lower_right->left = node;
  219. return true;
  220. }
  221. bool RotateRight(RB_Node* node)
  222. {
  223. if (node == m_nullNode || node->left == m_nullNode)
  224. {
  225. return false;//can't rotate
  226. }
  227. RB_Node* lower_left = node->left;
  228. node->left = lower_left->right;
  229. lower_left->parent = node->parent;
  230. if (lower_left->right != m_nullNode)
  231. {
  232. lower_left->right->parent = node;
  233. }
  234. if (node->parent == m_nullNode) //node is root
  235. {
  236. m_root = lower_left;
  237. m_nullNode->left = m_root;
  238. m_nullNode->right = m_root;
  239. //m_nullNode->parent = m_root;
  240. }
  241. else
  242. {
  243. if (node == node->parent->right)
  244. {
  245. node->parent->right = lower_left;
  246. }
  247. else
  248. {
  249. node->parent->left = lower_left;
  250. }
  251. }
  252. node->parent = lower_left;
  253. lower_left->right = node;
  254. return true;
  255. }
  256. bool Delete(KEY key)
  257. {
  258. RB_Node* delete_point = find(key);
  259. if (delete_point == m_nullNode)
  260. {
  261. return false;
  262. }
  263. if (delete_point->left != m_nullNode && delete_point->right != m_nullNode)
  264. {
  265. RB_Node* successor = InOrderSuccessor(delete_point);
  266. delete_point->data = successor->data;
  267. delete_point->key = successor->key;
  268. delete_point = successor;
  269. }
  270. RB_Node* delete_point_child;
  271. if (delete_point->right != m_nullNode)
  272. {
  273. delete_point_child = delete_point->right;
  274. }
  275. else if (delete_point->left != m_nullNode)
  276. {
  277. delete_point_child = delete_point->left;
  278. }
  279. else
  280. {
  281. delete_point_child = m_nullNode;
  282. }
  283. delete_point_child->parent = delete_point->parent;
  284. if (delete_point->parent == m_nullNode)//delete root node
  285. {
  286. m_root = delete_point_child;
  287. m_nullNode->parent = m_root;
  288. m_nullNode->left = m_root;
  289. m_nullNode->right = m_root;
  290. }
  291. else if (delete_point == delete_point->parent->right)
  292. {
  293. delete_point->parent->right = delete_point_child;
  294. }
  295. else
  296. {
  297. delete_point->parent->left = delete_point_child;
  298. }
  299. if (delete_point->RB_COLOR == BLACK && !(delete_point_child == m_nullNode && delete_point_child->parent == m_nullNode))
  300. {
  301. DeleteFixUp(delete_point_child);
  302. }
  303. delete delete_point;
  304. return true;
  305. }
  306. void DeleteFixUp(RB_Node* node)
  307. {
  308. while (node != m_root && node->RB_COLOR == BLACK)
  309. {
  310. if (node == node->parent->left)
  311. {
  312. RB_Node* brother = node->parent->right;
  313. if (brother->RB_COLOR == RED)
  314. {
  315. brother->RB_COLOR = BLACK;
  316. node->parent->RB_COLOR = RED;
  317. RotateLeft(node->parent);
  318. }
  319. else
  320. {
  321. if (brother->left->RB_COLOR == BLACK && brother->right->RB_COLOR == BLACK)
  322. {
  323. brother->RB_COLOR = RED;
  324. node = node->parent;
  325. }
  326. else if (brother->right->RB_COLOR == BLACK)//left red and right black
  327. {
  328. brother->RB_COLOR = RED;
  329. brother->left->RB_COLOR = BLACK;
  330. RotateRight(brother);
  331. }
  332. else if (brother->right->RB_COLOR == RED)
  333. {
  334. brother->RB_COLOR = node->parent->RB_COLOR;
  335. node->parent->RB_COLOR = BLACK;
  336. brother->right->RB_COLOR = BLACK;
  337. RotateLeft(node->parent);
  338. node = m_root;
  339. }
  340. }
  341. }
  342. else
  343. {
  344. RB_Node* brother = node->parent->left;
  345. if (brother->RB_COLOR == RED)
  346. {
  347. brother->RB_COLOR = BLACK;
  348. node->parent->RB_COLOR = RED;
  349. RotateRight(node->parent);
  350. }
  351. else
  352. {
  353. if (brother->left->RB_COLOR == BLACK && brother->right->RB_COLOR == BLACK)
  354. {
  355. brother->RB_COLOR = RED;
  356. node = node->parent;
  357. }
  358. else if (brother->left->RB_COLOR == BLACK)
  359. {
  360. brother->RB_COLOR = RED;
  361. brother->right->RB_COLOR = BLACK;
  362. RotateLeft(brother);
  363. }
  364. else if (brother->left->RB_COLOR == RED)
  365. {
  366. brother->RB_COLOR = node->parent->RB_COLOR;
  367. node->parent->RB_COLOR = BLACK;
  368. brother->left->RB_COLOR = BLACK;
  369. RotateRight(node->parent);
  370. node = m_root;
  371. }
  372. }
  373. }
  374. }
  375. m_nullNode->parent = m_root;
  376. node->RB_COLOR = BLACK;
  377. }
  378. inline RB_Node* InOrderPredecessor(RB_Node* node)
  379. {
  380. if (node == m_nullNode) //null node has no predecessor
  381. {
  382. return m_nullNode;
  383. }
  384. RB_Node* result = node->left; //get node's left child
  385. while (result != m_nullNode) //try to find node's left subtree's right most node
  386. {
  387. if (result->right != m_nullNode)
  388. {
  389. result = result->right;
  390. }
  391. else
  392. {
  393. break;
  394. }
  395. } //after while loop result==null or result's right child is null
  396. if (result == m_nullNode)
  397. {
  398. RB_Node* index = node->parent;
  399. result = node;
  400. while (index != m_nullNode && result == index->left)
  401. {
  402. result = index;
  403. index = index->parent;
  404. }
  405. result = index; // first right parent or null
  406. }
  407. return result;
  408. }
  409. inline RB_Node* InOrderSuccessor(RB_Node* node)
  410. {
  411. if (node == m_nullNode) //null node has no successor
  412. {
  413. return m_nullNode;
  414. }
  415. RB_Node* result = node->right; //get node's right node
  416. while (result != m_nullNode) //try to find node's right subtree's left most node
  417. {
  418. if (result->left != m_nullNode)
  419. {
  420. result = result->left;
  421. }
  422. else
  423. {
  424. break;
  425. }
  426. } //after while loop result==null or result's left child is null
  427. if (result == m_nullNode)
  428. {
  429. RB_Node* index = node->parent;
  430. result = node;
  431. while (index != m_nullNode && result == index->right)
  432. {
  433. result = index;
  434. index = index->parent;
  435. }
  436. result = index; //first parent's left or null
  437. }
  438. return result;
  439. }
  440. void InOrderTraverse()
  441. {
  442. ofstream outfile;
  443. outfile.open(".\\word.txt");
  444. outfile.close();
  445. InOrderTraverse(m_root);
  446. }
  447. void InOrderTraverse(RB_Node* node)
  448. {
  449. if (node == m_nullNode)
  450. {
  451. return;
  452. }
  453. else
  454. {
  455. InOrderTraverse(node->left);
  456. ofstream outfile;
  457. outfile.open(".\\word.txt", ios::app);
  458. CStringA sa(node->key);
  459. CStringA sb(node->data);
  460. outfile << sa << " " << sb << endl;
  461. outfile.close();
  462. InOrderTraverse(node->right);
  463. }
  464. }
  465. ~RB_Tree()
  466. {
  467. clear(m_root);
  468. delete m_nullNode;
  469. }
  470. private:
  471. void clear(RB_Node* node)
  472. {
  473. if (node == m_nullNode)
  474. {
  475. return;
  476. }
  477. else
  478. {
  479. clear(node->left);
  480. clear(node->right);
  481. delete node;
  482. }
  483. }
  484. private:
  485. RB_Node *m_nullNode;
  486. RB_Node *m_root;
  487. };

MFC拾遗的更多相关文章

  1. vs2010静态链接MFC库报链接错误

    由于需要将MFC程序在其它电脑上运行,所以需要将动态链接的MFC改成静态链接,本以为很简单,没想到链接的时候出现下面的链接错误: uafxcw.lib(afxmem.obj) : error LNK2 ...

  2. MFC中成员变量的声明顺序与析构顺序

    第一次用博客,第一篇随笔,就写今天遇到的一个问题吧. 在VS2008的MFC对话框程序,窗口成员变量的声明顺序与其析构顺序相反,即,先声明的变量后析构,后声明的变量先析构.未在其他模式下测试. cla ...

  3. VC中的MFC到底是什么?

    1. 微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是一个微软公司提供的类库(class libraries),以C++类的形式封装了Windows API ...

  4. MFC&Halcon之实时视频监控

    上一篇实现了在MFC的窗体内显示图片,本篇介绍如何在MFC窗体内实时显示摄像头的影像. 要实现的功能是点击一个“开始”按钮,可以显示影像,再点击“停止”按钮,可以停止显示. 因为实时显示影像需要在一个 ...

  5. Redis命令拾遗二(散列类型)

    本文版权归博客园和作者吴双共同所有,欢迎转载,转载和爬虫请注明原文地址 :博客园蜗牛NoSql系列地址  http://www.cnblogs.com/tdws/tag/NoSql/ Redis命令拾 ...

  6. 基础拾遗------redis详解

    基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...

  7. MFC快速入门 - 菜单

    本文仅用于学习交流,商业用途请支持正版!转载请注明:http://www.cnblogs.com/mxbs/p/6231104.html 打开VS2010,依次打开File – New – Proje ...

  8. MFC画线功能总结

    本文仅用于学习交流,商业用途请支持正版!转载请注明:http://www.cnblogs.com/mxbs/p/6216464.html MFC画线功能要点有二:其一,鼠标按下时记录初始位置为线的起始 ...

  9. MFC消息映射机制以及画线功能实现

    ---此仅供用于学习交流,切勿用于商业用途,转载请注明http://www.cnblogs.com/mxbs/p/6213404.html. 利用VS2010创建一个单文档标准MFC工程,工程名为Dr ...

随机推荐

  1. 【LeetCode】9 Palindrome Number 回文数判定

    题目: Determine whether an integer is a palindrome. Do this without extra space. Some hints: Could neg ...

  2. ActiveX、OLE和COM/DCOM

    ActiveX:开放的集成平台 为开发人员. 用户和 Web生产商提供了一个快速而简便的在 Internet 和 Intranet 创建程序集成和内容的方法(就是提供了一个方法). 使用 Active ...

  3. C# 生成条形码图片

    在网上看到一些人写关于条形码的代码都很长,有的甚至拿来卖,所以查了下资料,希望能对大家有帮助. 我的实现原理是: 其实Windows本身就有一个字体是用来显示条形码的. 只要将数字改为这种字体就变成了 ...

  4. Nuget~管理自己的包包

    很久很久以前,自己就想有个包包,最近又从网上淘了一个,价格不便宜呢,99块,还是个小腰包,不过作工还算精良,我喜欢的类型,帆布休闲包,可以将我的手机,耳机,水,小烟,小酒,小伞都放里,方便至极,哈哈!

  5. python基础一 day15 复习

    迭代器和生成器迭代器 可迭代协议 —— 含有iter方法的都是可迭代的 迭代器协议 —— 含有next和iter的都是迭代器 特点 节省内存空间 方便逐个取值,一个迭代器只能取一次.生成器 —— 迭代 ...

  6. 用requests爬取图片

    # coding=utf-8 from bs4 import BeautifulSoup import requests import urllib x = 1 def crawl(url): res ...

  7. 数据库连接池 dbcp与c3p0的使用区别

    众所周知,无论现在是B/S或者是C/S应用中,都免不了要和数据库打交道.在与数据库交 互过程中,往往需要大量的连接.对于一个大型应用来说,往往需要应对数以千万级的用户连接请求,如果高效相应用户请求,对 ...

  8. 01_3_创建一个Servlet

    01_3_创建一个Servlet 1.创建一个Servlet import java.io.IOException; import java.io.PrintWriter; import javax. ...

  9. cocos2dx for android 接入 fmod的过程

    cocos2dx自带的音效播放有SimpleAudioEngine和AudioEngine两个,SimpleAudioEngine可以播放简单的音效, 如果播放音效数量过多的话,多导致有些音效播放失败 ...

  10. Kenneth A.Lambert著的数据结构(用python语言描述)的第一章课后编程答案

    第6题:工资部门将每个支付周期的雇员信息的列表保存到一个文本文件, 每一行的格式:<last name><hourly wage><hours worked> 编写 ...