我有一个结构:

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....


当前,我调用使用这些KeyPair的函数。

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);
}


但是,此代码块不起作用... :(有人可以告诉我如何正确地将这些KeyPair放入向量中吗?

最佳答案

您必须使用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!

09-04 04:38