2D вектор с использованием структуры - PullRequest
0 голосов
/ 07 ноября 2018

Итак, у меня есть следующий код, где я читаю XML-файл и сохраняю значения в векторе. У меня нет большого опыта работы с векторами, но теперь, когда у меня есть свой параметр «двигатель», я хочу иметь возможность перейти к значению двигателя и прочитать параметры из этого вектора.

Должен ли я добавить что-то в мою структуру? Или инициализировать 2D-вектор vector<vector <NameValue>> motors; Если я инициализирую 2D-вектор, как я смогу заполнить вектор. Или есть хорошее руководство, которое может помочь мне полностью понять векторы?

Вот документация для TinyXML. http://www.grinninglizard.com/tinyxmldocs/index.html

#include <QCoreApplication>
#include <iostream>
#include <string>
#include <vector>
#include <stdexcept>
#include <tinyxml.h>

using namespace std; 

struct NameValue
{
    string motor;
    string name;
    string value;
};

vector<NameValue> read()
{   //READING XML FILE
    QString directory;
    string file;
    directory = QCoreApplication::applicationDirPath();
    file = directory.toUtf8().constData();
    file = file + "/Profile.xml";
    cout<<file<<endl;
    TiXmlDocument doc (file);
    if(!doc.LoadFile()){
        cout<<"Cannot open file"<<endl;}

    vector<NameValue> xmlread;
    NameValue elem;

    TiXmlElement *pRoot, *pParm, *pMotor;
    pRoot = doc.FirstChildElement("PRO");
    if (pRoot) //parsing
    {
     pMotor = pRoot->FirstChildElement("Motor");
      if(pMotor){
        while (pMotor)
        {
            elem.motor = pMotor->Attribute("value");
            pParm = pMotor->FirstChildElement("PARAMETER");
            while (pParm)
            {
                elem.name = pParm->Attribute("name");
                elem.value = pParm->Attribute("value");
                xmlread.push_back(elem);
                pParm = pParm->NextSiblingElement("PARAMETER");
            }
            pMotor = pMotor->NextSiblingElement("Motor");

        }
   }
}
   return xmlread;
}
int main (int argc, char *argv[])
{
   vector<NameValue> elems = read();
   cout<<elems[0].motor<<endl;

}

Вот фрагмент моего XML-файла:

<PRO>
   <Motor value = "1">
         <PARAMETER name = "SPEED" value = "100" />
         <PARAMETER name = "LOOP" value = "1" />
         <PARAMETER name = "DEADBAND" value = "10" />
   </Motor>
   <Motor value = "2">
         <PARAMETER name = "SPEED" value = "100" />
         <PARAMETER name = "LOOP" value = "1" />
         <PARAMETER name = "DEADBAND" value = "10" />
   </Motor>
   <Motor value = "3">
         <PARAMETER name = "SPEED" value = "100" />
         <PARAMETER name = "LOOP" value = "1" />
         <PARAMETER name = "DEADBAND" value = "10" />
   </Motor>
</PRO>

1 Ответ

0 голосов
/ 08 ноября 2018

То, что у вас уже есть, нуждается в очень небольшой модификации, чтобы получить 2D вектор. Просто используйте emplace_back для построения внутренних векторов на месте:

vector<vector<NameValue>> xmlread2D;
NameValue elem;

TiXmlElement *pRoot, *pParm, *pMotor;
pRoot = doc.FirstChildElement("PRO");
if (pRoot)
{
    pMotor = pRoot->FirstChildElement("Motor");
    while (pMotor)
    {
        // allocate new inner vector
        xmlread2D.emplace_back();
        auto& xmlread = xmlread2D.back();
        // in C++17 the above can be replaced with a single line

        // unmodified inner loop
        elem.motor = pMotor->Attribute("value");
        pParm = pMotor->FirstChildElement("PARAMETER");
        while (pParm)
        {
            elem.name = pParm->Attribute("name");
            elem.value = pParm->Attribute("value");
            xmlread.push_back(elem);
            pParm = pParm->NextSiblingElement("PARAMETER");
        }
        pMotor = pMotor->NextSiblingElement("Motor");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...