gpt4 book ai didi

c++ - 提高驱动程序的时间效率

转载 作者:行者123 更新时间:2023-11-30 04:43:42 28 4
gpt4 key购买 nike

抱歉,标题含糊不清。本质上,我正在尝试批准 C++ 驱动程序的时间(和整体)效率:

  1. 使用 ifstream 逐行读取文件

  2. 单独处理行对我的程序至关重要,因此我目前有 4 次单独调用 getline。

  3. 程序使用字符串流将字符串行读入整数 vector 。

  4. 最后,它将 vector 转换为整数链表。有没有什么方法或者函数可以直接把文件中的整数读入整数的ll中?

驱动代码如下:

int main(int argc, char *argv[])
{
ifstream infile(argv[1]);

vector<int> vals_add;
vector<int> vals_remove;

//Driver Code
if(infile.is_open()){

string line;
int n;
getline(infile, line);
istringstream iss (line);


getline(infile, line);
istringstream iss2 (line);
while (iss2 >> n){
vals_add.push_back(n);
}

getline(infile, line);
istringstream iss3 (line);

getline(infile, line);
istringstream iss4 (line);
while (iss4 >> n){
vals_remove.push_back(n);
}


int array_add[vals_add.size()];
copy(vals_add.begin(), vals_add.end(), array_add);


int array_remove[vals_remove.size()];
copy(vals_remove.begin(), vals_remove.end(), array_remove);



Node *ptr = CnvrtVectoList(array_add, sizeof(array_add)/sizeof(int));
print(ptr);
cout << "\n";

for(int i = 0; i < vals_remove.size(); i++){
deleteNode(&ptr, vals_remove[i]);
}


print(ptr);
cout << "\n";

}

这是一个小示例输入:

7

6 18 5 20 48 2 97

8

3 6 9 12 28 5 7 10

第 2 行和第 4 行必须作为单独的列表处理,第 1 行和第 3 行是列表的大小(它们必须动态分配内存,因此大小必须与输入保持精确)。

最佳答案

有很多地方可以改进。

首先,删除不必要的代码:你没有使用 ississ3 .接下来,你的 array_addarray_remove似乎是多余的。直接使用 vector 。

如果您大致知道平均读取多少个值,请在 vector 中保留空间以避免重复调整大小和复制(实际上您的输入中似乎有这些数字;使用 这个信息而不是扔掉它!)。您也可以替换您的 while使用 std::copy 循环阅读和 std::istream_iterator

你还没有展示如何CnvrtVectoList已实现,但一般由于缺乏局部性,链接列表的工作效率不是特别高:它们将数据扔到整个堆中。连续的容器(= vector )几乎总是更有效,即使您需要删除中间的元素。尝试改用 vector 并仔细计时性能。

最后,您可以排序这些值吗?如果是这样,那么您可以使用对 std::lower_bound 的迭代调用更有效地实现值的删除。 , 或一次调用 std::set_difference .

如果(并且仅当!)开销实际上是在从文件中读取数字时,重构您的 IO 代码并且不要单独读取行(这样您将避免很多冗余分配)。相反,直接扫描输入文件(可选择使用缓冲区或内存映射)并手动跟踪您遇到了多少换行符。然后您可以使用 strtod 从输入读取缓冲区扫描数字的函数系列。

或者,如果您可以假设输入是正确的,则可以使用文件中提供的信息避免读取单独的行:

int add_num;
infile >> add_num;
std::copy_n(std::istream_iterator<int>(infile), std::inserter(your_list, std::end(your_list));

int del_num;
infile >> del_num;
std::vector<int> to_delete(del_num);
std::copy_n(std::istream_iterator<int>(infile), del_num, to_delete.begin());
for (auto const n : del_num) {
deleteNode(&ptr, n);
}

关于c++ - 提高驱动程序的时间效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58100610/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com