set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列。元素插入过程是按排序规则插入,所以不能指定插入位置。
set采用红黑树变体的数据结构实现,红黑树属于平衡二叉树。在插入操作和删除操作上比vector快。
set不可以直接存取元素。(不可以使用at.(pos)与[]操作符)。
multiset与set的区别:set支持唯一键值,每个元素值只能出现一次;而multiset中同一值可以出现多次。
不可以直接修改set或multiset容器中的元素值,因为该类容器是自动排序的。如果希望修改一个元素值,必须先删除原有的元素,再插入新的元素。
set/multiset对象的默认构造
set setInt; //一个存放int的set容器。
set setFloat; //一个存放float的set容器。
set setString; //一个存放string的set容器。
multiset mulsetInt; //一个存放int的multi set容器。
multi set multisetFloat; //一个存放float的multi set容器。
multi set multisetString; //一个存放string的multi set容器。
set的插入与迭代器
set.insert(elem); //在容器中插入元素。
set.begin(); //返回容器中第一个数据的迭代器。
set.end(); //返回容器中最后一个数据之后的迭代器。
set.rbegin(); //返回容器中倒数第一个元素的迭代器。
set.rend(); //返回容器中倒数最后一个元素的后面的迭代器。
代码如下:
本代码验证了,集合中的元素唯一,默认按照从小到大的顺序排列。
void main9()
{
set set1;
for (int i = 0; i < 5; i++)
{
int tmp = rand();
set1.insert(tmp);
}
set1.insert(100);
set1.insert(100);
set1.insert(100);
set1.insert(100);
for (set::iterator it = set1.begin(); it != set1.end(); it++)
{
cout << *it << " ";
}
}
void main9()
{
set set1;
for (int i = 0; i < 5; i++)
{
int tmp = rand();
set1.insert(tmp);
}
set1.insert(100);
set1.insert(100);
set1.insert(100);
set1.insert(100);
for (set::iterator it = set1.begin(); it != set1.end(); it++)
{
cout << *it << " ";
}
//删除集合。
cout << endl;
cout << "删除集合:" << endl;
cout << "删除前set1的大小是" << set1.size() << endl;
while (!set1.empty())
{
set::iterator it = set1.begin();
cout << *it << endl;
set1.erase(set1.begin());
}
cout <<"删除后set1的大小是"<< set1.size() << endl;
}
void main92()
{
set set1;
set> set2;
set< int, greater> set3; // 从大到小。
for (int i = 0; i < 5; i++)
{
int tmp = rand();
set3.insert(tmp);
}
// 从大到小。
for (set>::iterator it = set3.begin(); it != set3.end(); it++)
{
cout << *it << endl;
}
}
class Student
{
public:
Student(char *name, int age)
{
strcpy_s(this->name, name);
this->age = age;
}
public:
char name[64];
int age;
};
struct FuncStudent
{
bool operator()(const Student &left, const Student &right)
{
if (left.age < right.age)
{
return true;
}
else
{
return false;
}
}
};
void main93()
{
set set1;
char name1[64] = "s1";
char name2[64] = "s2";
char name3[64] = "s3";
char name4[64] = "s4";
Student s1(name1, 31);
Student s2(name2, 44);
Student s3(name3, 65);
Student s4(name4, 23);
set1.insert(s1);
set1.insert(s2);
set1.insert(s3);
set1.insert(s4);
//遍历
for (set::iterator it = set1.begin(); it != set1.end(); it++)
{
cout << it->age << "\t" << it->name << endl;
}
}
int main()
{
// main92();
main93();
system("pause");
return 1;
}
pair返回的是,set.insert1的插入结果。
class Student
{
public:
Student(char *name, int age)
{
strcpy_s(this->name, name);
this->age = age;
}
public:
char name[64];
int age;
};
struct FuncStudent
{
bool operator()(const Student &left, const Student &right)
{
if (left.age < right.age)
{
return true;
}
else
{
return false;
}
}
};
void main93()
{
set set1;
char name1[64] = "s1";
char name2[64] = "s2";
char name3[64] = "s3";
char name4[64] = "s4";
char name5[64] = "s5";
Student s1(name1, 31);
Student s2(name2, 44);
Student s3(name3, 65);
Student s4(name4, 23);
Student s5(name5, 31);
pair::iterator, bool> pair1 = set1.insert(s1);
if (pair1.second == true)
{
cout << "插入s1成功" << endl;
}
else
{
cout << "插入s1失败" << endl;
}
set1.insert(s2);
//如何知道 插入 的结果
pair::iterator, bool> pair5 = set1.insert(s5); //如果两个31岁 能插入成功
if (pair5.second == true)
{
cout << "插入s5成功" << endl;
}
else
{
cout << "插入s5失败" << endl;
}
//遍历
for (set::iterator it = set1.begin(); it != set1.end(); it++)
{
cout << it->age << "\t" << it->name << endl;
}
}
int main()
{
// main92();
main93();
system("pause");
return 1;
}
和set的不同的地方在于,能把不同的元素添加到里面。
void main94()
{
multiset set1;
int tmp = 0;
printf("请输入multiset集合的值:");
scanf("%d", &tmp);
while (tmp != 0)
{
set1.insert(tmp);
printf("请输入multiset集合的值:");
scanf("%d", &tmp);
}
//遍历
for (multiset::iterator it = set1.begin(); it != set1.end(); it++)
{
cout << *it << " ";
}
cout << endl;
while (!set1.empty())
{
multiset::iterator it = set1.begin();
cout << *it << " ";
set1.erase(it);
}
}