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
列表和集合,因为可以在编译时计算表达式。
这可能看起来微不足道,但到目前为止我无法在网上找到它,所以
我想初始化一个整数集列表或一组整数集,像这样:
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
列表和集合,因为可以在编译时计算表达式。