刚刚开始写C++程序,现在遇到了这个问题。目前只看了C++ Primer 第五版的前几章,里面详细说了vector的初始化,以及迭代器,但是并没有详细说明怎么赋值。百度搜索了一些帖子,发现有以下几种方法:
1:迭代器赋值,这个本人知道,但是缺点是要用 for 循环,代码不够简洁
2:vector<double> p2(4, 0.0);
vector<double> p4(4, 1.0);
p2 = p4;
这个是本人目前用的,但是奇怪的是在运行程序的时候,有时候没问题,有时候会出现下面的问题,本人就傻了。
(gdb) s
694 p2 = p4; // Radiated gluon from colljet23
(gdb) p p2
$4 = std::vector of length 4, capacity 4 = {2.847704044428288, 0.08712303953697198, 1.3861864765274348, 2.4860239244479372}
(gdb) p p4
$5 = std::vector of length 4, capacity 4 = {16.121628775001703, 0.72265308163598341, -2.5018098411777703, 15.909922513989532}
(gdb) s
std::vector<double, std::allocator<double> >::operator= (this=0x7fffffffb8e0, __x=std::vector of length 4, capacity 4 = {…}) at /usr/include/c++/4.9/bits/vector.tcc:170
170 if (&__x != this)
3:p2.assign(p4.begin(), p4.end());
这个方法本人没用过。
4: copy
也没有用过
本人之前学过C语言基础,现在在使用一个程序,里面用的数组,好几个数组的初始化是4*2000000,数据个数是未知的,其实并没有那么多。程序运行完得花1分钟,但是我们需要用蒙特卡洛方法运行1000000次相似的过程,花的时间太长。本人怀疑程序占用太过内存导致运行时间太长,就计划把里面的数组改成vector,新的数据用vector.push_back()添加,每运行一个过程后就vector.clear(),应该可以减少所需内存。
1:迭代器赋值,这个本人知道,但是缺点是要用 for 循环,代码不够简洁
2:vector<double> p2(4, 0.0);
vector<double> p4(4, 1.0);
p2 = p4;
这个是本人目前用的,但是奇怪的是在运行程序的时候,有时候没问题,有时候会出现下面的问题,本人就傻了。
(gdb) s
694 p2 = p4; // Radiated gluon from colljet23
(gdb) p p2
$4 = std::vector of length 4, capacity 4 = {2.847704044428288, 0.08712303953697198, 1.3861864765274348, 2.4860239244479372}
(gdb) p p4
$5 = std::vector of length 4, capacity 4 = {16.121628775001703, 0.72265308163598341, -2.5018098411777703, 15.909922513989532}
(gdb) s
std::vector<double, std::allocator<double> >::operator= (this=0x7fffffffb8e0, __x=std::vector of length 4, capacity 4 = {…}) at /usr/include/c++/4.9/bits/vector.tcc:170
170 if (&__x != this)
3:p2.assign(p4.begin(), p4.end());
这个方法本人没用过。
4: copy
也没有用过
本人之前学过C语言基础,现在在使用一个程序,里面用的数组,好几个数组的初始化是4*2000000,数据个数是未知的,其实并没有那么多。程序运行完得花1分钟,但是我们需要用蒙特卡洛方法运行1000000次相似的过程,花的时间太长。本人怀疑程序占用太过内存导致运行时间太长,就计划把里面的数组改成vector,新的数据用vector.push_back()添加,每运行一个过程后就vector.clear(),应该可以减少所需内存。
解决方案
5
c++自动用=号就行了啊。或函数的话用引用传递
10
非也,在内存足够的情况下,使用数组的速度要高于vector,数组是连续的内存,而vector要不定期的申请、释放内存,在数据量大时,效率反而比较低。假如对数组元素有查询的需求,那则另当别论。
1000000次计算本身就耗时较多,假如单次运算算法不够优化,那计算耗时是肯定的。
还有一种可能,计算所用计算机内存较低,发生了内存交换,导致耗时较长,不过现如今内存普遍比较便宜,这个可能较小。
1000000次计算本身就耗时较多,假如单次运算算法不够优化,那计算耗时是肯定的。
还有一种可能,计算所用计算机内存较低,发生了内存交换,导致耗时较长,不过现如今内存普遍比较便宜,这个可能较小。
5
用swap试试
5
#include <iostream> #include <vector> int main () { std::vector<int> foo (3,100); // three ints with a value of 100 std::vector<int> bar (5,200); // five ints with a value of 200 foo.swap(bar); std::cout << "foo contains:"; for (unsigned i=0; i<foo.size(); i++) std::cout << " " << foo[i]; std::cout << "\n"; std::cout << "bar contains:"; for (unsigned i=0; i<bar.size(); i++) std::cout << " " << bar[i]; std::cout << "\n"; return 0; }
5
=运算符重载,或p2.assign(p4.begin(), p4.end());
10
进入gdb然后使用bt命令
可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。
可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。
5
引用或指针来减少赋值带来的巨大开销!
还有你可以先预测你数据量,使用resize先分配一次空间
还有你可以先预测你数据量,使用resize先分配一次空间
50
2. 设置观察点(WatchPoint)
观察点一般用来观察某个表达式(变量也是一种表达式)的值能否变化了。假如有变化,马上停住程序。有下面的几种方法来设置观察点:
watch <expr>
为表达式(变量)expr设置一个观察点。一旦表达式值有变化时,马上停住程序。
rwatch <expr>
当表达式(变量)expr被读时,停住程序。
awatch <expr>
当表达式(变量)的值被读或被写时,停住程序。
info watchpoints
列出当前设置的全部观察点。
观察点一般用来观察某个表达式(变量也是一种表达式)的值能否变化了。假如有变化,马上停住程序。有下面的几种方法来设置观察点:
watch <expr>
为表达式(变量)expr设置一个观察点。一旦表达式值有变化时,马上停住程序。
rwatch <expr>
当表达式(变量)expr被读时,停住程序。
awatch <expr>
当表达式(变量)的值被读或被写时,停住程序。
info watchpoints
列出当前设置的全部观察点。
5
*** Error in `./a.out”: double free or corruption (!prev): 0x0000000002af9a40 ***
很明显的错误 ,同一个内存free了两次
很明显的错误 ,同一个内存free了两次