刚刚开始写C++程序,现在遇到了这个问题。目前只看了C++ Primer 第五版的前几章,里面详细说了vector的初始化,以及迭代器,但是并没有详细说明怎么赋值。百度搜索了一些帖子,发现有以下几种方法: 3:p2.assign(p4.begin(), p4.end()); 4: copy 我之前学过C语言基础,现在在使用一个程序,里面用的数组,好几个数组的初始化是4*2000000,数据个数是未知的,其实并没有那么多。程序运行完得花1分钟,但是我们需要用蒙特卡洛方法运行1000000次类似的过程,花的时间太长。我怀疑程序占用太过内存导致运行时间太长,就打算把里面的数组改成vector,新的数据用vector.push_back()添加,每运行一个过程后就vector.clear(),应该可以减少所需内存。 |
|
5分 |
c++自动用=号就行了啊。。或者函数的话用引用传递
|
10分 | |
是啊,我现在也是用的 = 号, 可是你看我的调试信息,程序运行到这里出现问题了。。 |
|
我不知道这个程序得花多少内存,程序是在一个公共的64位linux服务器上运行的,总共有60多G的内存。这个程序需要存储的变量大概在5000个,具体大小只有等程序运行完了才知道。我以为C++里面的vector比数组高级,效率也会更高呢。如果数组的效率更高,那我只能把数组的2000000改成20000试试 |
|
对不起,弄错了,我贴出来的不是错误发生的地方,是调试的时候进入了头文件,我以为是在这个点出错了 |
|
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; } |
swap是交换两个对象,可是我只想给一个对象赋值,另一个需要保持不变 |
|
#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());
|
参看:http://www.cplusplus.me/1112.html
|
|
这上面写的我都知道,跟书上讲的没多少差别,而且也都是讲的初始化 |
|
恩,这个可以,我也会 |
|
好吧,事实是我把 gdb 调试进入了头文件的输出当成了 输出错误,因为 有时候这种输出太长了。。。
后来我调试的结果是 程序自己释放内存使用 free() 出错,可能是我使用vector 内存越界了,当我在vector使用前预先申请内存后,就没有这种报错了,可是我还是不知道程序自己在哪里 free()出错了。。。。 |
|
10分 |
进入gdb然后使用bt命令
可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。 |
我试了,还是那个错误。 KATT.push_back(KATT2); 输出: 奇怪,为何没有。。。还有别的方法吗? |
|
5分 |
引用或者指针来减少赋值带来的巨大开销!
还有你可以先预测你数据量,使用resize先分配一次空间 |
现在不纠结赋值的问题了。现在我想确定程序报错的真正原因,请看16和17楼。 |
|
50分 |
2. 设置观察点(WatchPoint)
观察点一般用来观察某个表达式(变量也是一种表达式)的值是否变化了。如果有变化,马上停住程序。有下面的几种方法来设置观察点: watch <expr> 为表达式(变量)expr设置一个观察点。一旦表达式值有变化时,马上停住程序。 rwatch <expr> 当表达式(变量)expr被读时,停住程序。 awatch <expr> 当表达式(变量)的值被读或被写时,停住程序。 info watchpoints 列出当前设置的所有观察点。 |
对,找到错误了,有两个地方。 |
|
5分 |
*** Error in `./a.out””: double free or corruption (!prev): 0x0000000002af9a40 ***
很明显的错误 ,同一个内存free了两次 |
KATT.push_back(KATT2);
这是什么?!你直接push一个vector<XXX>类型的数据吗? |