无法从向量访问初始化结构的内容

时间:2011-02-10 06:19:10

标签: c++ qt data-structures vector

我有一个结构:

typedef struct
{
    Qt::Key qKey;
    QString strFormType;
} KeyPair;

现在我初始化KeyPair实例化,以便将其用于我的自动化测试应用程序。

KeyPair gTestMenu[] =
{
    { Qt::Key_1 , "MyForm" },
    { Qt::Key_1 , "SubForm" },
    { Qt::Key_Escape, "DesktopForm" }
};

KeyPair gBrowseMenu[] =
{
    { Qt::Key_1 , "MyForm" },
    { Qt::Key_2 , "Dialog" },
    { Qt::Key_Escape, "DesktopForm" }
};

and like 100 more instantiations....

目前,我调用了一个使用这些KeyPairs的函数。

pressKeyPairs( gTestMenu );
pressKeyPairs( gBrowseMenu );
and more calls for the rest... 

我想将所有这些KeyPair实例化放在一个向量中,所以我不必再调用pressKeyPairs()一百次......我是一个使用向量的新手......所以我试过:

std::vector<KeyPair, std::allocator<KeyPair> > vMasterList;
vMasterList.push_back( *gTestMenu );
vMasterList.push_back( *gBrowseMenu );

std::vector<KeyPair, std::allocator<KeyPair> >::iterator iKeys;
for(iKeys = vMasterList.begin(); iKeys != vMasterList.end(); ++iKeys)
{
    pressKeyPairs(*iKeys);
}

然而,这个代码块不起作用...... :(有人可以告诉我如何将这些KeyPairs正确放入向量中吗?

2 个答案:

答案 0 :(得分:2)

您必须使用insert使用不同的数组填充向量。这是你应该怎么做的。

//initialized with one array
std::vector<KeyPair> vMasterList(gTestMenu, gTestMenu + 3);

//adding more items
vMasterList.insert( vMasterList.end(),  gBrowseMenu , gBrowseMenu  + 3); 

然后重新实现您的pressKeyPair功能,以便您可以使用std::for_each头文件中的<algorithm>

 //pressKeyPair will be called for each item in the list!
 std::for_each(vMasterList.begin(), vMasterList.end(), pressKeyPair);

以下是编写pressKeyPair函数的方法:

  void pressKeyPair(KeyPair &keyPair) //takes just one item!
  {
       //press key pair!
  }

在我看来,这是更好的设计,因为它不再需要在呼叫站点进行“手动”循环!

您甚至可以为列表中的前5个项目调用pressKeyPair

 //pressKeyPair will be called for first 5 items in the list!
 std::for_each(vMasterList.begin(), vMasterList.begin() + 5, pressKeyPair);

又一个例子:

 //pressKeyPair will be called for 5 items after the first 5 items, in the list!
 std::for_each(vMasterList.begin()+5, vMasterList.begin() + 10, pressKeyPair);

编辑:

如果你想使用手动循环,那么你要使用它:

std::vector<KeyPair>::iterator it;
for( it = vMasterList.begin(); it != vMasterList.end(); ++it)
{
    pressKeyPair(*it);
}

但我会说它并不像前面描述的那样优雅。请记住,这假设函数pressKeyPair具有此签名:

void pressKeyPair(KeyPair &keyPair); //it doesn't accept array!

答案 1 :(得分:2)

我认为问题在于代码

vMasterList.push_back( *gTestMenu );

仅向向量添加gTestMenu的单个元素,即第一个元素。原因是此代码等同于以下内容:

vMasterList.push_back( gTestMenu[0] );

我认为从中可以更容易地看出出现了什么问题。

要解决此问题,您可能希望将gTestMenu中的所有元素添加到主列表中。您可以使用三参数vector::insert函数执行此操作:

vMasterList.insert(v.begin(),  // Insert at the beginning
                   gTestMenu,  // From the start of gTestMenu...
                   gTestMenu + kNumTests); // ... to the end of the list

在这里,您需要指定gTestMenukNumTests的测试次数为gBrowseMenu。您可以对vector执行相同操作。

顺便说一句,如果您只想使用默认的std::allocator,则无需在std::vector<KeyPair> vMasterList; 声明中指定分配器类型。你可以写

{{1}}

你会完全没事。