我画了一张图片来描述我正在寻找的数据结构。
声明这种数据结构的最有效的C ++方法是什么,其中:
尺寸在第一个维度固定,动态在第二个维度。在第二维中,它在插入元素时动态增加。
每列中只允许使用唯一元素(图中)。订购并不重要
我已经探讨过使用std::set
和set< set<int> > array
。但是,解决方案是否可以包括如何声明,初始化和访问数据结构。
答案 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;
}
}
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;
}