2010-03-28 46 views
4

备选1的C++矢量,重新使用的临时变量的优选方式矢量内存:填满结构

{ 
board.push_back(Sticker()); 
Sticker &sticker = board.back(); 
sticker.x = x + foreground.x; 
sticker.y = foreground.y; 
sticker.width = foreground.width; 
sticker.height = foreground.height; 
} 

{ 
board.push_back(Sticker()); 
Sticker &sticker = board.back(); 
sticker.x = x + outline.x; 
sticker.y = outline.y; 
sticker.width = outline.width; 
sticker.height = outline.height; 
} 

你更喜欢哪种方法?

编辑:为了讨论起见,假定任务必须由构造

回答

16

我选择的一个外部对其进行一个 - 给贴一个构造函数的参数。然后:

board.push_back(Sticker(outline.x, foo.bar, etc.)); 

编辑:代码来说明构造函数的参数名:

#include <iostream> 
using namespace std; 

struct S { 
    int a, b; 
    S(int a, int b) : a(a), b(b) { 
    } 
}; 

int main() {  
    S s(1, 2); 
    cout << s.a << " " << s.b << endl; 
} 
+0

我的建议为好,但我更喜欢'board.push_back(贴纸(轮廓,X)); board.push_back(贴纸(前景,x))'而不是逐一传递每个作品。 – 2010-03-28 15:35:06

+0

Ya,在里面添加一个init列表,并且瞧' – Maciek 2010-03-28 15:43:59

+0

你会怎样称呼你的构造函数参数,因为它们理想地应该和类成员具有相同的名字? – henle 2010-03-28 16:15:17

0

替代1.为什么只为一个变量创建范围?通常附近有一个封闭的范围(至少,你应该保持你的函数/程序很小,这样可以确定它的范围)。

为什么?您可以创建较短的变量名称,例如st在这种情况下。由于作业将在附近,因此清晰度不应有任何损失。其实它会看起来更简单,更清洁。另外,如果矢量需要从几个其他间接级别解除引用/访问,那么它也将简化代码。

+0

真的吗?我不介意那么多。关于范围设定:如果编写器写入一个全新的变量,我认为编译器可以更容易地优化临时程序。 – henle 2010-03-28 15:36:51

+1

@henle不关心编译器。这些都是非常先进的软件(只需考虑C++的存在时间),并且可以计算出相当多的东西。范围是为你,所以你不会犯错误。 – foraidt 2010-03-28 16:36:39

+0

@mxp I ** do **关心编译器 – henle 2010-03-28 17:36:31

2

board.resize(sticker_count);

然后遍历所有向量并设置参数。

0

如何的WinForms风格:

// Class members 

Sticker sticker1; 
Sticker sticker2; 
Board board; 

// Initialization 

void InitBoard() 
{ 
    sticker1.x = x + foreground.x; 
    sticker1.y = foreground.y; 
    sticker1.width = foreground.width; 
    sticker1.height = foreground.height; 

    sticker2.x = x + outline.x; 
    sticker2.y = outline.y; 
    sticker2.width = outline.width; 
    sticker2.height = outline.height; 

    // Add to board 
    board.push_back(sticker1); 
    board.push_back(sticker2); 
}