| 刚刚开始写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是交换两个对象,可是我只想给一个对象赋值,另一个需要保持不变 | |
| 
多谢你的实例,有木有更方便的 赋值 | |
| 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>类型的数据吗? | |