C++98 中整数集列表的初始化

Initialization of list of sets of integers in C++98

这可能看起来微不足道,但到目前为止我无法在网上找到它,所以

我想初始化一个整数集列表或一组整数集,像这样:

list< set<int> > lsi = {{}};

或者像这样:

set< set<int> > ssi = {{5}, {6}, {7}};

C++98。这样做的原因是我必须在不接受C++11的提交系统中将其作为练习提交。

我发现了如何使用旧语法从整数数组初始化容器,例如

int tmp[] = {1,2,3};
set<int> s (tmp, tmp + sizeof(tmp) / sizeof(tmp));

但不是 list< set<int> >

如评论中所述,如果没有 c+11 / boost,这是不可能的。

也就是说,最短的初始化方法可能是重复 set 的初始化(您在问题中提到):

int set1v[] = {10, 20, 30, 40};
int set2v[] = {11, 22, 33, 44};
int set3v[] = {15, 25, 35, 45};

set<int> setV[] = {
    set<int>(set1v, set1v + sizeof(set1v) / sizeof(set1v[0])),
    set<int>(set2v, set2v + sizeof(set2v) / sizeof(set2v[0])),
    set<int>(set3v, set3v + sizeof(set3v) / sizeof(set3v[0]))
};

set< set<int> > mySet(setV, setV + sizeof(setV) / sizeof(setV[0]));

顺便说一句,由于您多次检查数组的大小,我建议您使用 count macro:

#define COUNT_OF(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x])))))

会好看一点:

#define END_OF(x) (x + COUNT_OF(x))

int set1v[] = {10, 20, 30, 40};
int set2v[] = {11, 22, 33, 44};
int set3v[] = {15, 25, 35, 45};

set<int> setV[] = {
    set<int>(set1v, END_OF(set1v)),
    set<int>(set2v, END_OF(set2v)),
    set<int>(set3v, END_OF(set3v))
};

set< set<int> > mySet(setV, END_OF(setV));

我会给你一些我用来初始化静态 STL 存储的方法,但是在这种情况下语法变得有些晦涩:

template <typename Type>
struct SetInit : public std::set<Type> {
    SetInit<Type>& operator()(const Type& data) {
        this->insert(data);
        return *this;
    }
};

int main () {
    std::set<std::set<int> > test_set = SetInit<std::set<int> >() // Call ctor
        (SetInit<int>()(1)(2)(3))(SetInit<int>()(4)(5)(6)); // Each element in () is inserted in the set
    return 0;
}

基本思想是使用 operator() 将元素包含在存储中。这个想法的优点是它可以用来初始化 static 列表和集合,因为可以在编译时计算表达式。