Невозможно получить доступ к содержимому инициализированной структуры из вектора - PullRequest
0 голосов
/ 10 февраля 2011

У меня есть структура:

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

Теперь я инициализирую экземпляры KeyPair, чтобы использовать его для своего приложения Automated Test.

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

В настоящее время я вызываю функцию, использующую эти пары ключей.

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

Однако этот блок кода не работает ... :( Может кто-нибудь сказать мнекак правильно разместить эти пары ключей в векторе?

Ответы [ 2 ]

2 голосов
/ 10 февраля 2011

Я думаю, что проблема в том, что код

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

Здесь вам нужно указать, сколько тестов в gTestMenu, как kNumTests.Вы можете сделать то же самое для gBrowseMenu.

Кстати, вам не нужно указывать тип распределителя в объявлении vector, если вы просто хотите использовать значение по умолчанию std::allocator.Вы можете просто написать

std::vector<KeyPair> vMasterList;

И все будет в порядке.

2 голосов
/ 10 февраля 2011

Вы должны использовать 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!
  }

На мой взгляд, это лучший дизайн, так как он больше не нуждается в "ручном" цикле на вызывающем сайте!

Вы даже можете позвонить pressKeyPair для первых 5 элементов списка следующим образом:

 //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!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...