2010-08-16 84 views
5

说我有以下几点:std :: vector可以='d到另一个std :: vector吗?

std::vector<int> myints; 

,然后我返回一个int向量函数:

std::vector<int> GiveNumbers() 
{ 
    std::vector<int> numbers; 
for(int i = 0; i < 50; ++i) 
{ 
    numbers.push_back(i); 
} 

return numbers; 
} 

我能那么做:

myints = GiveNumbers(); 

会安全地这样做让它使得myint中的数字为0到49,没有别的了?这样做会清楚以前在myint中可能会发生什么?如果不是最好的方法来做到这一点?

谢谢

回答

7

是。这是安全的。您将会将GiveNumbers()功能的结果复制到myints。这可能不是最有效的方式,但它是安全和正确的。对于小向量,效率差异不会那么大。

+1

+1,它可能不会在实际生活中调用op =,以便对效率进行警告。 – Brian 2010-08-16 17:59:42

+2

如果你的编译器支持RVO,它不应该是低效率的。 – jamesdlin 2010-08-16 18:27:03

+1

RVO应该将它从复制到复制一次才能减少。 – 2010-08-16 18:34:15

1

是的,它会分配它,它会清除接收向量之前的内容。

1

是的,事实上,您的return numbersGiveNumbers()正在复制矢量到堆栈上。

当您使用operator=,你会得到相同的内容到你的新载体

+0

好吧完美,谢谢! – jmasterx 2010-08-16 17:58:10

+0

我投票赞成你的评论。由于优化 – pm100 2010-08-16 18:27:21

1

如前所述,尽管不是最有效的方法,但使用起来非常安全。

为了节省资源,最好通过引用传递向量,并直接对其进行修改。

void setNumbers(vector<int> &nums) 
{ 
    nums.resize(50); 
    for(int i = 0; i < 50; ++i) 
    { 
     nums[i] = i; 
    } 
} 

正如还提到,效率可能不会让非常小的载体的巨大差异,但在更大的载体实际上可能是巨大的。

您可以通过修改原始载体得到节约,直接在两个方面:

  1. 节省内存(不创建一个临时矢量)
  2. 速度储蓄(仅迭代N次设置载体在一种通过,而不是采取一次通过设置温度矢量和第二次通过将它们复制到原始)
+0

如果您的编译器支持RVO,那么它不应该是低效的,RVO会为您执行该转换。 – jamesdlin 2010-08-16 18:26:45

+0

另外,接受引用参数的版本应该小心,首先调用std :: vector :: clear(),或者检查传入的参数是否不能以超过50个元素开始。 – jamesdlin 2010-08-16 19:00:48

+0

@jamesdlin:请注意使用'nums.resize(50);'。 – KevenK 2010-08-16 21:41:07