pongo庞果:xml字符串文件的解析——为什么我的代码效率低?
来源:互联网 发布:office2016 for mac卡 编辑:程序博客网 时间:2024/05/18 01:18
最近正在学习C++ STL,尝试着使用C++解庞果上面的在线编程挑战题目,结果总是说超过3s时间。这是为啥呀为啥呀?哥只是用了个string 而已啊
题目 :http://hero.pongo.cn/Home/Index 蓝港在线:xml字符串文件的解析
代码贴出来,留待日后有能力了改进效率:
#include <iostream>#include <sstream>#include <string>#include <boost/progress.hpp>using namespace std;using namespace boost;string intToString(const int n ){ std::stringstream newstr; newstr << n; return newstr.str();}void ltrim(string& s){ const char drop = ' '; // trim right s.erase(s.find_last_not_of(drop)+1); // trim left //s.erase(0,s.find_first_not_of(drop));}// LAB means Left Angle Brace: "<"void jumpTilEndorLAB(string& str, int& pos){ while((str[pos] != '\0') && (str[pos] != '<')) { pos++; }}//parse xml header: <?xml .... ?>void parseXmlHeader(string& str, int& pos){ if(('<' == str[pos]) && ('?' == str[pos+1])) { while(('?' != str[pos]) && ('>' != str[pos+1])) { pos++; } pos += 2; //jump over ?> jumpTilEndorLAB(str, pos); } return ;}// parse the xmlstring ParsingXML(string str){ string result; result.reserve(1024); int bodyPos = 0; int length = str.length(); parseXmlHeader(str, bodyPos); if(bodyPos == length) { return result; } // Body format: //<catigory1_name> // <entity1_name> // <attr1="..." att2="..." /> // </entity1_name> // <entity2...> //</catigory1_name> int categoryStart = bodyPos; int categoryEndAll = length; // parse all categories while( categoryStart != categoryEndAll) { string category(str.substr(categoryStart+1, str.find_first_of('>', categoryStart)-categoryStart-1)); //cout << category << endl; result += (category + "\r\n"); int entityStart = categoryStart + category.length() + 2; //jump over <category_name> int entityEndAll = str.find(("</"+category+">"), categoryStart); jumpTilEndorLAB(str, entityStart); //parse the category's entities int entityIndex = 1; while(entityStart != entityEndAll) { string entity(str.substr(entityStart+1, str.find_first_of('>', entityStart)-entityStart-1)); //cout << "\t" << entity << " " << entityIndex++ << endl; result += "\t"; result += (entity + " " + intToString(entityIndex) + "\r\n"); entityIndex++; int attrStart = entityStart + 2 + entity.length(); //jump over <entity_name> while(str[attrStart] != '<') { attrStart++; } attrStart++; //jump over the "<" before attribute while((str[attrStart] == ' ') || (str[attrStart] == '\t') || (str[attrStart] == '\r') || (str[attrStart] == '\n')) // jump over ' ' before attribute if spaces exist { attrStart++; } // parse the attributes while((str[attrStart] != '/') && (str[attrStart+1] != '>')) { int equivalentPos = str.find_first_of('=', attrStart); string attrName = str.substr(attrStart, equivalentPos-attrStart); ltrim(attrName); //cout << "\t\t" << attrName << ":"; result += "\t\t"; result += (attrName + ":"); int valueBegin = str.find_first_of('\"', equivalentPos+1)+1; int valueEnd = str.find_first_of('\"', valueBegin+1); string attrValue = str.substr(valueBegin, valueEnd-valueBegin); //cout << attrValue << endl; result += (attrValue + "\r\n"); attrStart = valueEnd + 1; //parse next attribute while((str[attrStart] == ' ') || (str[attrStart] == '\t') || (str[attrStart] == '\r') || (str[attrStart] == '\n')) // jump over ' ' before attribute if spaces exist { attrStart++; } } entityStart = attrStart + 5 + entity.length(); //jump over "/></entity_name>" jumpTilEndorLAB(str, entityStart); //parse next entity } categoryStart = entityStart + 3 + category.length(); //jump over </category_name> jumpTilEndorLAB(str, categoryStart); //parse next category } return result;}int main(){ string str1("<?xml version=\"1.0\" ?>\\r\n<Books>\\r\n\t<Book>\\r\n\t\t<Name = \"The C++ Programming Language\" \\r\n\t\tAuthor=\"Bjarne Stroustrup\" />\\r\n\t</Book>\r\n\t<Book>\\r\n\t\t<Name = \"Effective C++\" \\r\n\t\tAuthor = \"Scott Meyers\" />\\r\n\t</Book>\\r\n</Books>"); //cout << str1 << endl; string result1; { progress_timer pt; for(int i = 0; i < 1000; i++) { result1 = ParsingXML(str1); } } cout << result1; return 1;}
注:此代码效率低,需要改进!
- pongo庞果:xml字符串文件的解析——为什么我的代码效率低?
- 为什么说虚函数的效率低
- XML库的解析效率
- 为什么我的ArcSDE数据库执行完版本压缩(Compress)后查询分析效率仍然很低
- 我在CSDN的第一篇博文,关于TinyXml类库 解析 xml文件或字符串
- Java生成和解析XML格式文件和字符串的实例代码【dom4j中的SAXReader对象读取并解析xml文件】
- 解析xml的字符串
- jquery解析XML字符串或XML文件的方法
- flex解析xml文件和xml字符串的疑问
- jquery解析XML字符串或XML文件的方法
- 使用Java解析XML文件或XML字符串的例子
- 为什么学习效率如此低,我很迷茫?
- 字符串的完美度(pongo的编程挑战..)
- 庞果英雄会——xml字符串文件的解析
- 庞果英雄会——xml字符串文件的解析
- 各种解析xml方式的效率比较
- 效率很低的一周
- 效率低的日子怎么办?
- 数对之差的最大值
- 项目中遇到的httpclient性能问题
- POJ 2251 Dungeon Master
- Linux 找不到php.ini
- c++,vc6.0,中友元函数,无法访问私有字段(private)的问题(problem),cannot access private member declared in class 'Date'
- pongo庞果:xml字符串文件的解析——为什么我的代码效率低?
- 《Professional Java Tools For Extreme Programming》
- 【树形DP】 HDU 2196 Computer
- uva 11111
- poj 2553 强连通
- 线程睡眠,挂起,阻塞的一个形象比喻
- Java中 forward 和redirect的区别
- SQL基础--视图
- minSdkVersion、targetSdkVersion、targetApiLevel的区别