我创建了一个数据包结构。我读了一个文件的文本并转换为字典顺序。为了做到这一点,我必须将两个字符串转换为小写以比较它们(一个用于当前节点,一个用于它旁边的节点)。但我的问题是,当我有大文本文件时,它必须继续将我插入的每个节点的字符串转换为小写,有时需要很长时间才能处理。我想知道是否有更好的方法来调整它,这样我就可以增加性能时间。
void insert(string v)
{
if(head == NULL){ //empty list
head = new BagNode;
head->dataValue = v;
//head->dataCount = 0;
head->next = NULL;
}
else
{
BagNode * n = new BagNode; // new node
n->dataValue = v;
BagNode * current = head; //for traversal
//current = head;
n->dataCount = 0;
if(!isBefore(current->dataValue, v)) //new head
{
n->next = head;
head = n;
}
else{ //mid and tail insert
while(current->next && isBefore(current->next->dataValue,v))
{
current = current->next;
}
n->next = current->next;
current->next = n;
}
}
}
比较两个节点
bool isBefore(string a, string b)
{
transform(a.begin(), a.end(), a.begin(), ::tolower);
transform(b.begin(), b.end(), b.begin(), ::tolower);
if(a == b) {
return true;
}
else {
return false;
}
}
答案 0 :(得分:0)
我会删除对此transform
的重复调用:
void insert(string v)
{
transform(v.begin(), v.end(), v.end(), ::tolower);
if(head == NULL){ //empty list
head = new BagNode;
head->dataValue = v;
//head->dataCount = 0;
head->next = NULL;
}
else
{
BagNode * n = new BagNode; // new node
n->dataValue = v;
BagNode * current = head; //for traversal
//current = head;
n->dataCount = 0;
if(!isBefore(current->dataValue, v)) //new head
{
n->next = head;
head = n;
}
else{ //mid and tail insert
while(current->next && isBefore(current->next->dataValue,v))
{
current = current->next;
}
n->next = current->next;
current->next = n;
}
}
}
bool isBefore(string a, string b)
{
if(a == b) {
return true;
}
else {
return false;
}
}
您可以看到有关转化here的一些附加信息。这个转换的建议是在你的范围内循环。找到这样的东西的方法是在GCC上使用-pg
标志进行编译。这将启用分析,您会看到包含isBefore
和transform
函数的热点。