首页 新闻 搜索 专区 学院

大家看看这块代码怎么优化一下?

0
悬赏园豆:50 [待解决问题]
int main() {
	std::vector<std::list<double>> _vector;
	for (int i = 0; i < 100000000; i++)
	{
		std::list<double> _list;
		_list.push_back(1.0);
		_list.push_back(2.0);
		_list.push_back(3.0);
		_list.push_back(4.0);
		_list.push_back(5.0);
		std::cout << "插入第" << i << "个值" << std::endl;
		_vector.push_back(_list);
	}
}
禅元天道的主页 禅元天道 | 初学一级 | 园豆:152
提问于:2021-09-03 10:43
< >
分享
所有回答(5)
0

用 java 重写。

领南森林公园 | 园豆:216 (菜鸟二级) | 2021-09-03 22:13

?????

支持(0) 反对(0) 禅元天道 | 园豆:152 (初学一级) | 2021-09-04 10:18

@禅元天道: java 是世界上最好的语言,用 java 重写,你不亏啊。[手动狗头]

支持(0) 反对(0) 领南森林公园 | 园豆:216 (菜鸟二级) | 2021-09-08 09:35
0

int main() {
std::vector<std::list<double>> _vector;
for (int i = 0; i < 100000000; i++)
{
std::list<double> _list;
for(double j=1.0;j<=5.0;j++){
_list.push_back(1.0);
}
std::cout << "插入第" << i << "个值" << std::endl;
_vector.push_back(_list);
}
}

除了五个push_back可以写成循环感觉没什么可优化的了

计算机知识杂谈 | 园豆:410 (菜鸟二级) | 2021-09-04 10:44

5个push_back只是一个示例,没抓住重点

支持(0) 反对(0) 禅元天道 | 园豆:152 (初学一级) | 2021-09-06 14:09
0
int main() {
	std::vector<std::list<double>> _vector;
	for (int i = 0; i < 100000000; i++)
	{
		std::list<double> _list;
		_list.push_back(i%5+1,0);
		std::cout << "插入第" << i << "个值" << std::endl;
		_vector.push_back(_list);
	}
}

这样可行?

if  __name__ =="__main__":
    for i in range(1,10000000):
        print(i%5+1)

结果:

>>> 1
>>> 2
>>> 3
>>> 4
>>> 5
>>> 1
>>> 2
>>> 3
>>> 4
>>> 5
>>> 1
>>> 2
>>> 3
>>> 4
>>> 5
>>> 1 
混在园子里的底层码农 | 园豆:1406 (小虾三级) | 2021-09-06 14:02

很明显你被楼上误导了,没抓住重点

支持(0) 反对(0) 禅元天道 | 园豆:152 (初学一级) | 2021-09-06 14:10

@禅元天道: 哥,你这里就是数据追加吧,

我要看看 后面的大佬咋优化

这个跟 net 类似吧

初始化 一个 list,然后填充十万次

list<user> userlist=new list<user>(){};
for(int i =0,i++, i<10000000){
    user  u=new (){
           id =i
       }
 userlist.appent(u)
}

这样的问题我也想问咋优化 呜呜呜

0

std::vector<std::list<double>> _vector;
_vector.reserve(100000000);
for (int i = 0; i < 100000000; ++i) {
_vector.emplace_back(std::list<double>{1.0, 2.0, 3.0, 4.0, 5.0});
}
C++11的话可以写成这样

FayeValentine | 园豆:204 (菜鸟二级) | 2021-09-08 16:27

还可以再优化 你的list 每次循环都构造析构,可以在循环外面创建好,这样只是每次循环copy构造一次。

支持(1) 反对(0) MyCPlusPlus | 园豆:43 (初学一级) | 2021-09-10 14:49
0
  1. 循环内的链表申明放到循环外来做,然后在循环内申明链表的地方改为list. clear()调用来达到目的。
    原因:每次循环开始都会重新构造list,循环结束会自动调用list析构函数释放内存。其实这里只需要每次循环前清空list即可,没必要每次重新构造list。当循环次数足够大时,效率上会有很大影响。(重新构造的开销要比list.clear()大,去调试跟踪下就知道了构造要重新生成head节点)list析构也是调用的clear。
  2. 如果list中的内容是固定的知道次数可以将list换成固定数组,构造一个局部变量即可,连清空的动作都可以省了(每次确保数组全部赋值的情况下)。
    c++引入类后比c更加“智能”,但同时也屏蔽了很多细节,就比如编译器给你调用的构造析构函数等。
Cloo_clam | 园豆:202 (菜鸟二级) | 2021-09-11 17:59
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册