【问题标题】:Dealing with vector of list of struct处理结构列表的向量
【发布时间】: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.9330.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

例如,如果36两个项目的总概率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来创建FFISuppAssociatedItem
  • 把它分解成更小的块,一次解决一个,然后再次询问您是否遇到任何您自己无法解决的问题。

标签: c++ vector struct stl


【解决方案1】:

因为我只理解你在第 1 阶段的意思 - 我只会帮助它。

您的代码 - 如下所示应该遍历所有 data 向量元素 - 因此停止条件应该是简单的 data.size()

声明data.size() - 1 让我想起了C 数组......好吧。 std::vector 不是数组,并且通过迭代直到 data.size() - 1 您丢失了最后一项。

我不明白第 2 阶段和第 3 阶段的目标是什么。

【讨论】:

    猜你喜欢
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多