存储独特元素的最佳C ++方法

时间:2015-05-21 13:42:59

标签: c++ data-structures

Figure

我画了一张图片来描述我正在寻找的数据结构。

声明这种数据结构的最有效的C ++方法是什么,其中:

  1. 尺寸在第一个维度固定,动态在第二个维度。在第二维中,它在插入元素时动态增加。

  2. 每列中只允许使用唯一元素(图中)。订购并不重要

  3. 我已经探讨过使用std::setset< set<int> > array。但是,解决方案是否可以包括如何声明,初始化和访问数据结构。

4 个答案:

答案 0 :(得分:1)

那样的东西?

int main()
{
    const unsigned int FIXED_SIZE=10;
    std::array<std::set<int>, FIXED_SIZE> data;

    data[1].insert(4);
    data[2].insert(100);
    data[2].insert(200);

    // Calculation:
    for( auto a : data )
    {
        int mw=0;

        for ( auto s: a )
        {
            mw+=s;
        }
        if ( a.size() )
        {
            mw/=a.size();

            std::cout << "MW in class is " << mw << std::endl;
        }
        else
        {
            std::cout << "class was empty" << std::endl;
        }
    }
};

如果无法使用c ++ 11,只需将std :: array替换为 std::set<int> data[FIXED_SIZE] 并使用旧式 for循环替换for循环。

答案 1 :(得分:1)

以下是如何创建和使用此类结构的示例

// Example program
#include <algorithm>
#include <array>
#include <iostream>
#include <set>

int main()
{
    std::array<std::set<double>, 4> bins = {std::set<double>{1.0, 2.0, 5.0},
                                            std::set<double>{7.0, 2.0},
                                            std::set<double>{3.0, 9.0 ,1.0},
                                            std::set<double>{7.0, 0.0, 1.0, 4.0}};
    bins[1].insert(3);

    for (auto const& bin : bins)
    {
        std::cout << "average: " << std::accumulate(bin.begin(), bin.end(), 0.0) / bin.size();
        std::cout << "\tvalues : ";
        for (auto const& value : bin) std::cout << value << " ";
        std::cout << std::endl;
    }
}

Output

average: 2.66667    values : 1 2 5 
average: 4          values : 2 3 7 
average: 4.33333    values : 1 3 9 
average: 3          values : 0 1 4 7 

修改
如果您无权访问C ++ 11,则可以使用vector代替array,但要知道它不是固定大小的。您也无法使用auto。因此,您可以将代码更改为

#include <algorithm>
#include <vector>
#include <iostream>
#include <set>

int main()
{
    std::vector<std::set<double>> bins = {{1.0, 2.0, 5.0},
                                          {7.0, 2.0},
                                          {3.0, 9.0, 1.0},
                                          {7.0, 0.0, 1.0, 4.0}};
    bins[1].insert(3);

    for (std::vector<std::set<double>>::iterator itBin = bins.begin()
         itBin != bins.end();
         ++itBin)
    {
        std::set<double> const& bin = *itBin;
        std::cout << "average: " << std::accumulate(bin.begin(), bin.end(), 0.0) / bin.size();
        std::cout << "\tvalues : ";
        for (std::set<double>::iterator itValue = bin.begin();
             itValue != bin.end();
             ++itValue)
        std::cout << *itValue << " ";
        std::cout << std::endl;
    }
}

答案 2 :(得分:0)

仅在C ++ 11中,考虑到订单并不重要,并假设&#34;固定大小&#34;第一个维度的仅在运行时已知:

#include <vector>
#include <unordered_set>

template <class T>
class MyDataStructure
{
public:

    typedef std::unordered_set<T>     column_type;
    typedef std::vector<column_type>  row_type;

    MyDataStructure()
        { clear(); }
    explicit MyDataStructure( size_t n )
        { resize(n); }

    void clear()
        { m_data.clear(); }
    void resize( size_t n )
        { m_data.resize(n); }

    // Number of columns
    inline size_t size() const 
        { return m_data.size(); }

    // Access column k (eg for iteration)
    inline const column_type& column( size_t c ) const { return m_data[c]; }
    inline       column_type& column( size_t c )       { return m_data[c]; }

    // Insert in column k
    inline void insert( size_t c, const T& val ) 
        { column(c).insert(val); }
    inline void insert( size_t c, T&& val ) 
        { column(c).emplace(std::forward<T>(val)); }

private:
    row_type m_data;
};

如果需要,您可以轻松添加成员变量以跟踪元素总数。您还可以轻松实现元素删除(erase)和搜索(find)。如果您需要非C ++ 11解决方案,请移除安装插入并将unordered_set替换为set

答案 3 :(得分:0)

对于C ++,请使用std::tr1::array + std::set

#include <tr1/array>
#include <set>

int main( )
{
    std::tr1::array< std::set<float>, 7> foo;

    foo[1].insert(1.7F);
    foo[1].insert(2.3F);
    foo[6].insert(9.0F);

    return 0;
}

对于C ++ 11,请使用std::array +(std::set / std::unordered_set

#include <array>
#include <unordered_set>

int main( )
{
    std::array< std::unordered_set<int>, 3> obj;

    foo[1].insert(1);
    foo[1].insert(2);
    foo[3].insert(1);

    return 0;
}