我刚刚在火车上编码,这会创建一个对象矢量。 如果有人建议让它更优雅或有效,我将不胜感激?
#include <iostream>
#include <vector>
using namespace std;
typedef struct{
short xpos,ypos;
short width, height;
short area;
}LABELPROP;
int get_property(int n,LABELPROP *pP)
{
if(n%2)
{
pP->xpos=n*2;
pP->ypos=n*3;
return 1;
}
else return 0;
}
int main()
{
vector<LABELPROP> myvector;
cout<<"Initial Number :"<<myvector.size()<<endl;
LABELPROP temporal;
// LABELPROP *pT=&temporal;
for(int n=1;n<=10;n++) //10 objects
{
//if(get_property(n,pT))
if(get_property(n,&temporal))
myvector.push_back(temporal);
}
for(int i=0;i<myvector.size();i++)
cout<<"("<<myvector[i].xpos<<","<<myvector[i].ypos<<")"<<endl;
return 0;
}
正如你所看到的,我删除了我最初放置的不必要的指针。
temporal结构从get_property函数获取其值,这就是我将其作为指针的原因
提前致谢
答案 0 :(得分:2)
您正在以C风格编写C ++。你不需要输入你的结构,只需使用:
struct LabelProp
{
LabelProp(short xpos, short ypos) : xpos(xpos), ypos(ypos) {}
short xpos,ypos;
short width, height;
short area;
};
我还更改了命名,因为大多数约定都使用所有大写名称作为常量或宏。我还添加了一个要使用的构造函数。
您get_property
返回int
,但由于这是c ++,请返回bool
。
可能更好的想法是将get_property
替换为addIfOdd
并让它看起来像:
void addIfOdd(int n, std::vector<LabelProp>& results)
{
if(n%2)
{
results.emplace_back(n * 2, n * 3);
}
}
int main()
{
std::vector<LabelProp> myvector;
for(int n=1;n<=10;n++) //10 objects
{
addIfOdd(n, myvector);
}
}
答案 1 :(得分:1)
看起来你不必要地迭代整个范围的整数,实际上它是你之后的奇数。为什么不将范围限制为奇数? (只有一半的迭代次数),例如:
{elem.userId}
使用现代C ++,您可以为您的类添加构造函数:
for(int i = 1; i < 10; i += 2) { /* 1, 3, ..., 9 */ }
并将所有代码替换为explicit label_prop(int n)
: xpos{static_cast<short>(n * 2)}, ypos{static_cast<short>(n * 3)} {}
,,例如:
std::generate_n
在这里,您要指定您需要5个连续的奇数,从1开始。
答案 2 :(得分:0)
如果您的编译器足够现代并且支持C ++ 11功能,您可以使用新的基于范围的for循环,如下所示:
for(auto& x : myvector)
cout<<"("<<x.xpos<<","<<x.ypos<<")"<<endl;
另外,为了提高效率,如果事先知道向量的大小,可以使用reserve方法,这样就可以避免不必要的对象重新分配和内存分配/解除分配,这可能很昂贵