我将文本文件读为:
的std ::矢量<的std ::列表<结构> >
我的数据格式为:
1 0.933 0.9 2 0.865 0.6 3 0.919 0.2 4 0.726 0.5
3 0.854 0.6 5 0.906 0.2 6 0.726 0.5
1 0.906 0.2 2 0.726 0.5
1 0.933 0.2 2 0.865 0.5 4 0.919 0.1 5 0.726 0.5 6 0.933 0.9
其中每一行由一些整数组成,每个整数都有2个实数,
例如: 在第一行中,整数 1 必须为实数 0.933 , 0.9
这是扫描数据的代码:
struct Lines1 {
int Item;
float Prob;
float W;
};
std::istream& operator>>(std::istream &is, Lines1 &d)
{
return is >> d.Item >> d.Prob>> d.W;
}
float threshold;
std::map<int, float> FFISupp;
std::map <int, vector <int> > AssociatedItem;
std::vector<std::list<Lines1>> data;
void ScanData()
{
ifstream in;
in.open(dataFile);
std::string line;
int i = 0;
while (std::getline(in, line))
{
std::stringstream Sline1(line);
std::stringstream ss(line);
std::list<Lines1 > inner;
Lines1 info;
while (ss >> info)
{
inner.push_back(info);
}
data.push_back(inner);
}
}
现在我成功地将数据存储在地图data
中的文本文件中,这是strcut列表的向量
但是我没有成功处理strcut(数据)列表的向量来执行以下操作:
1-创建地图 FFISupp
,以便:
FFISupp (key = the 6 distinct integer number in the data struct, value = the summation of probabilities for each number)
例如:
由于整数1
在三个位置的数据集中出现,整数1
的总概率= 0.933 + 0.906 + 0.933 = 2.772
==&GT; FFISupp的结果
FFISupp (1, 2.772)
FFISupp (2, 2.456)
.
.
FFISupp (6,1.659)
2-创建地图 AssociatedItem
,以便:
AssociatedItem (key = 6 distinct integer number, value = the associated items with this number)
关联项表示,例如,数据集中的整数1表示其他整数,如(2,3,4,5,6)
AssociatedItem (1, (2,3,4,5,6))
AssociatedItem (2, (1,3,4,5,6))
AssociatedItem (3, (1,2,4,5,6))
AssociatedItem (4, (1,2,3,5,6))
AssociatedItem (5, (1,2,3,4,6))
AssociatedItem (6, (1,2,3,4,5))
3-删除所有具有概率总和的结果的项目&lt;来自 FFISupp
的阈值
并同时更新 FFISupp
和 AssociatedItem
例如,如果两个项3
和6
具有总概率&lt;阈值,然后,我将更新FFISupp
FFISupp (1, 2.772)
FFISupp (2, 2.456)
FFISupp (4, 1.645)
FFISupp (5,1.632)
还更新AssociatedItem
AssociatedItem (1, (2,4,5))
AssociatedItem (2, (1,4,5))
AssociatedItem (4, (1,2,5))
AssociatedItem (5, (1,2,4))
这是我的尝试:
void Pass()
{
for (unsigned i = 0; i < data.size() - 1; ++i)
{
for (unsigned k = 0; i < data[i].size() - 1; ++k)
{
for (unsigned l = k + 1; l < data[i].size(); ++l)
{
auto p1 = make_pair(data[i][k].Item, data[i][k].Prob);
FFISupp[p1.first] += p1.second;
AssociatedItem[data[i][k].Item].push_back(data[i][l].Item);
}
}
}
/*update the FFISupp, and AssociatedItem by erasing allitems with <= Min_Threshold*/
std::map<int, float> ::iterator current = FFISupp.begin();
std::map<int, vector <int>> ::iterator current2 = AssociatedItem.begin();
while (current != FFISupp.end())
{
if (current->second <= threshold)
{
current = FFISupp.erase(current);
while (current2 != AssociatedItem.end())
{
current2 = AssociatedItem.erase(current2);
++current2;
}
}
else
++current;
}
}
答案 0 :(得分:0)
因为我只明白你在第一阶段的意思 - 我只会帮助它。
您的代码 - 如下所示应迭代所有data
向量元素 - 因此停止条件应该只是data.size()
。
陈述data.size() - 1
让我想起C
数组......好吧。 std::vector
不是数组,通过迭代直到data.size() - 1
,您将失去最后一项。
我不明白第2阶段和第3阶段的目标是什么。