QVector> размер - PullRequest
       12

QVector> размер

0 голосов
/ 16 марта 2019

Я хочу узнать общее количество элементов в объекте QVector<QVector<type>>, скажем myobject.Один из способов сделать это состоит в том, чтобы установить цикл for следующим образом:

int siz;
QVector<type> temp;
for(int i=0; i<myobject.size(); i++)
{
    temp = myobject[i];
   for(int j=0; j<temp.size(); j++)
   {
     siz += temp.size();
   }
}

Несмотря на то, что это выполнимо, этот способ мне кажется довольно громоздким.Есть ли более эффективные или аккуратные альтернативы для оценки размера QVector<QVector<type>>

Ответы [ 2 ]

2 голосов
/ 16 марта 2019

В дополнение к ответу Р Саху , я просто хочу указать, что вы получаете бесплатную копию внутреннего QVector объекта в каждой итерации внешнего цикла.Возможно, вы захотите получить константную ссылку на внутренний вектор.

Другой способ сделать это - использовать алгоритм std::accumulate, то есть:

int wholeSize = std::accumulate(m.cbegin(), m.cend(), 0,
                                [](int currentSize, const QVector<type> &v) {
                                  return currentSize + v.size();
                                });
2 голосов
/ 16 марта 2019

Логика, используемая в размещенном вами коде, неверна.

temp = myobject[i];
for(int j=0; j<temp.size(); j++)
{
  siz += temp.size();
}

добавляет размер temp к siz слишком много раз. Его нужно добавить к siz только один раз.

Вам нужно:

int siz = 0;
for(int i=0; i<myobject.size(); i++)
{
   siz += myobject.at(i).size();
}

Как отмечает @Mike, использование myobject[i] может привести к глубокой копии. Для доступа только для чтения используйте myobject.at(i).

С документация :

at() может быть быстрее, чем operator[](), потому что это никогда не вызывает глубокого копирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...