【发布时间】:2014-06-26 08:53:55
【问题描述】:
我将文本文件读为:
std::vector<:list> >
表格中我的数据:
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
==> 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- 删除所有具有概率总和结果的项目 FFISupp
同时更新 FFISupp 和 AssociatedItem
例如,如果3和6两个项目的总概率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;
}
}
【问题讨论】:
-
您能否说明问题,仅说明问题,而不涉及解决方案域?
-
void Pass()的问题,不知道怎么处理structdata的list的vector来创建FFISupp和AssociatedItem -
把它分解成更小的块,一次解决一个,然后再次询问您是否遇到任何您自己无法解决的问题。