Название: QVector push_back
Отправлено: Firefox от Май 20, 2014, 13:07
здравствуйте у меня вопрос про добавление в вектор значений. есть 2 структуры и такая организация: strict First { int a; int b; }; struct mainST { QString A; QVector <First> fst; };
Заполняю их следующим образом .h QVector<mainST> mST;
.cpp
for(int i=0;i<50;i++) { mainST currMainST; currMainST.A=i; First FF; for(int j=0;j<30;j++) { FF.a=... FF.b=... currMainST.fst.push_back(FF); } mST.push_back(currMainST); }
вместо добавления структур First последовательно в контейнер они затирают предыдущую, то есть в итоге размер QVector <First> fst; равен 1.
Название: Re: QVector push_back
Отправлено: OKTA от Май 20, 2014, 13:16
А как вот это должно работать? ;D currMainST.fst.at(i).push_back(FF);
Название: Re: QVector push_back
Отправлено: Firefox от Май 20, 2014, 13:19
ну я же в QVector< First> добавляю структуру First. как тогда правильно?
Название: Re: QVector push_back
Отправлено: OKTA от Май 20, 2014, 13:21
А у вас это компилируется? ;D Я думаю лучше писать так currMainST.fst.push_back(FF);
Название: Re: QVector push_back
Отправлено: Firefox от Май 20, 2014, 13:23
извините написано действительно так как вы написали, просто у меня в программе там большие структуры поэтому просто попыталась описать суть.
Название: Re: QVector push_back
Отправлено: OKTA от Май 20, 2014, 13:25
Ну, уж лучше привести код, как есть. Этот вполне рабочий..
Название: Re: QVector push_back
Отправлено: Firefox от Май 20, 2014, 13:44
хидер
struct impuls { int NumberImpuls_ofParcels; float Parcels_ofImpuls; float LowerCarrierFrequency_ofImpuls; float TopCarrierFrequency_ofImpuls; float Duretion_ofImpuls; float TimeInterval_betweenImpuls; float RateCangeFrequency_ofImpuls; QString NumberPicture; };
struct parsel { float AverageFrequency_ofParcels; float Band_ofParcels; float Duration_ofParcels; int CountImpuls_ofParcels; QVector<impuls> imp; QString CarrierClass;
};
struct base_GLS { QString TipGls; QVector<parsel> pars; }; class read_BD : public QObject { Q_OBJECT public: explicit read_BD(QObject *parent = 0);
QVector<base_GLS> base; QVector <QString> gls; };
.cpp int read_BD::load_data(QString fliename) { QFile fp(fliename); if(!fp.open(QIODevice::ReadOnly)) return 0; QString data; int count=0;
data=fp.readAll(); QStringList lst=data.split("\n"); parseData(lst);
qDebug()<<count; fp.close(); }
void read_BD::parseData(QStringList list) { for(int i=1;i<list.size()-1;i++) { QStringList line=list.at(i).split(";"); findGLS(line); } for(int j=0;j<gls.size();j++) { //лист строк по данному названию QStringList dataCurrentCel; qDebug()<<"list.size()"<<list.size();
for(int i=1;i<list.size()-1;i++) {
//выбираем последовательно все строки из базы относящиеся к данному названию if(list.at(i).contains(gls.at(j),Qt::CaseSensitive)) { dataCurrentCel.push_back(list.at(i));
} }
base_GLS currBaseGls; currBaseGls.TipGls=gls.at(j); for(int k=0;k<dataCurrentCel.size();k++) { //разбиваем строку на столбцы со значениями QStringList line=dataCurrentCel.at(k).split(";"); QStringList lineNext; if(k==150) { int yy=0; } if(k<dataCurrentCel.size()-1) { lineNext<<dataCurrentCel.at(k+1).split(";"); } qDebug()<<"line"<<line; qDebug()<<"lineNext"<<lineNext; parsel curr_par; if(control_item(line.at(3))>0 || control_item(line.at(3))==-1.f) { curr_par.CountImpuls_ofParcels=control_item(line.at(3)); curr_par.AverageFrequency_ofParcels=control_item(line.at(0))*1000.f; curr_par.Band_ofParcels=control_item(line.at(1)); curr_par.Duration_ofParcels=control_item(line.at(2)); curr_par.CarrierClass=line.at(12);
}
if(control_number_impuls(list.at(4))>0) { for(int t=1;t<control_number_impuls(list.at(4));t++) { impuls ii; ii.NumberImpuls_ofParcels=t; ii.Parcels_ofImpuls=control_item(line.at(5)); ii.LowerCarrierFrequency_ofImpuls=control_item(line.at(6))*1000.f; ii.TopCarrierFrequency_ofImpuls=control_item(line.at(7))*1000.f; ii.Duretion_ofImpuls=control_item(line.at(8)); ii.TimeInterval_betweenImpuls=control_item(line.at(9)); ii.RateCangeFrequency_ofImpuls=control_item(line.at(10));; ii.NumberPicture=line.at(11); curr_par.imp.append(ii); // ПРОБЛЕМА ИМЕННО ПРИ ДОБАВЛЕНИИ ДАННОЙ СТРУКТУРЫ qDebug()<<curr_par.imp.size(); } } else if(control_number_impuls(list.at(4))==0) { impuls ii; ii.NumberImpuls_ofParcels=control_item(line.at(4)); ; ii.Parcels_ofImpuls=control_item(line.at(5)); ii.LowerCarrierFrequency_ofImpuls=control_item(line.at(6))*1000.f; ii.TopCarrierFrequency_ofImpuls=control_item(line.at(7))*1000.f; ii.Duretion_ofImpuls=control_item(line.at(8)); ii.TimeInterval_betweenImpuls=control_item(line.at(9)); ii.RateCangeFrequency_ofImpuls=control_item(line.at(10));; ii.NumberPicture=line.at(11); curr_par.imp.push_back(ii); // ПРОБЛЕМА ИМЕННО ПРИ ДОБАВЛЕНИИ ДАННОЙ СТРУКТУРЫ qDebug()<<curr_par.imp.size(); } else { ; }
if(k==dataCurrentCel.size()-1) currBaseGls.pars.push_back(curr_par); else if(k< dataCurrentCel.size()-1 && (control_item(lineNext.at(3))>0 || control_item(lineNext.at(3))==-1.f)) { qDebug()<<"urr_par.imp.size()"<<curr_par.imp.size(); currBaseGls.pars.push_back(curr_par); }
} base.push_back(currBaseGls); }
}
Название: Re: QVector push_back
Отправлено: OKTA от Май 20, 2014, 14:14
А вы проверяли, сколько раз программа заходит в эти условия, где должен добавляться элемент?
Название: Re: QVector push_back
Отправлено: Firefox от Май 20, 2014, 14:24
проверяла программа точно заходит туда. я ставила точку останова прямо на добавление.
Название: Re: QVector push_back
Отправлено: OKTA от Май 20, 2014, 14:41
а сколько раз заходит?
Название: Re: QVector push_back
Отправлено: Firefox от Май 20, 2014, 15:10
там по названию сортируется, по первому названию 8 структур заполняется вот 8 раз и заходит, потом дальше по разному
Название: Re: QVector push_back
Отправлено: Firefox от Май 20, 2014, 15:11
заходит в это условие: else if(control_number_impuls(list.at(4))==0)
Название: Re: QVector push_back
Отправлено: Igors от Май 20, 2014, 15:22
По ходу дела strict First { int a; int b; };
Есть малюсенький но очень полезный класс QPair (или std::pair). Напр тогда вместо FF.a=a; FF.b=b; currMainST.fst.push_back(FF);
можно с комфортом записвть C++ (Qt) currMainST.fst.push_back(QPair(a, b));
И присваивание дописывать не придется, и оператор < (сделано, пользуйтесь)
Название: Re: QVector push_back
Отправлено: Firefox от Май 20, 2014, 15:49
это был пример организации, ниже приведен реальный код и там более 2-х составляющих в структурах.
Название: Re: QVector push_back
Отправлено: OKTA от Май 20, 2014, 16:02
если он 8 раз заходит, то 8 раз и добавляет, вектор не может чудить)) Вы же в дебаггере смотрели, что он показывает в содержимом вектора на каждой итерации?
Название: Re: QVector push_back
Отправлено: Firefox от Май 20, 2014, 16:13
yнашла ошибку. он действительно все хорошо добавляет, проблема была в том что экземпляр структуры curr_par создан внутри цикла, потому при выходе из цикла структура очищалась
Название: Re: QVector push_back
Отправлено: Firefox от Май 26, 2014, 11:19
Не хочу создавать новую тему, спрошу здесь ещё один вопрос. У меня проблема с русским текстом. работаю в МСВС. осуществляю выборку по названию из QStringList строк в которых встречается данное название. Все хорошо если в названии есть цифра или латинские буквы. когда название русскими буквами, выбирает все подряд лишь бы по числу символов одинаково было. Пересохраняла файл из которого читаю в UTF-8, KOI8-R. QStringList list; QVector<QString> gls; /* заполнение gls, list*/ ..... for(int j=0;j<gls.size();j++) { //лист строк по данному названию QStringList dataCurrent; for(int i=1;i<list.size()-1;i++) {
//выбираем последовательно все строки из базы относящиеся к данному названию if(list.at(i).contains(gls.at(j),Qt::CaseSensitive)) // ВОТ ТУТ НЕ СРАБАТЫВАЕТ РУССКИЙ { dataCurrent.push_back(list.at(i)); } //... } } пробовала так QTextCodec *cdc=QTextCodec::codecForName("UTF-8");//KOI8-R ... for(int j=0;j<gls.size();j++) { //лист строк по данному названию QStringList dataCurrent; for(int i=1;i<list.size()-1;i++) { QStringList ggg=list.at(i).split(";"); //выбираем последовательно все строки из базы относящиеся к данному названию if(cdc->fromUnicode(ggg.at(13).toAscii())==cdc->fromUnicode(gls.at(j).toAscii())) // ВОТ ТУТ НЕ СРАБАТЫВАЕТ РУССКИЙ { dataCurrent.push_back(list.at(i)); } //... }
подскажите. как правильно сравнить строки с русским текстом?
Название: Re: QVector push_back
Отправлено: Hellraiser от Май 26, 2014, 12:04
QString::toLocal8Bit()
Название: Re: QVector push_back
Отправлено: Firefox от Май 26, 2014, 13:09
не сработало
Название: Re: QVector push_back
Отправлено: Firefox от Май 26, 2014, 14:53
Прошу прощение за беспокойство. проблема решилась сама собой, перекодировкой файла из которого я читаю. перекодировала в Unicode а потом в UTF-8 обратно и все заработало.
|