创建一个对象的矢量

时间:2017-05-22 05:31:31

标签: c++ vector stl

我刚刚在火车上编码,这会创建一个对象矢量。 如果有人建议让它更优雅或有效,我将不胜感激?

#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函数获取其值,这就是我将其作为指针的原因

提前致谢

3 个答案:

答案 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方法,这样就可以避免不必要的对象重新分配和内存分配/解除分配,这可能很昂贵