C++程序:将列表转换为集合


C++中的列表与向量类似,都是容器,但列表的实现基于双向链表,而向量的实现基于数组。列表的元素通常不存储在连续的内存位置,而是分散在内存中。列表在任何位置都能提供相同的常数时间操作,这是使用列表的主要特点。另一方面,集合是包含特定类型唯一值的容器,所有元素都按升序排序。这两个容器不同,但有多种方法可以将列表转换为集合。我们将在下面详细讨论该方法。

朴素方法

最简单也是最朴素的方法是定义两个不同的容器:一个列表类型,另一个集合类型,并将列表的每个元素复制到集合中。

语法

list<int> myList;
set<int> mySet;
for ( int const &val: myList ) {
   mySet.insert(val);
}

算法

  • 将输入放入列表中。
  • 迭代遍历列表中的每个元素,并将它们插入到集合中。
  • 显示集合的内容。

示例

#include <iostream>
#include <set>
#include <list>
using namespace std;
int main(){
   
   //initializing the list
   list<int> myList = { 10, 30, 65, 98, 76, 44, 32, 73, 81, 29 };
   set<int> mySet;
   cout<< "The list contents are:" << endl;
   
   //displaying the list contents
   for ( int const &val: myList ) {
      cout << val << ' ';
   }
   
   //copying the elements of the list
   for ( int const &val: myList ) {
      mySet.insert(val);
   }
   cout << "\nThe set contents are:" << endl;
   for ( int const &val: mySet ) {
      cout << val << ' ';
   }
   return 0;
}

输出

The list contents are:
10 30 65 98 76 44 32 73 81 29 
The set contents are:
10 29 30 32 44 65 73 76 81 98 

使用范围构造函数

创建集合时,必须将列表的起始和结束指针作为参数提供给构造函数以使用范围构造函数。

语法

list<int> myList;
set<int> mySet(begin(myList), end(myList));

算法

  • 将输入放入列表中。

  • 创建集合时,将列表的起始和结束指针传递给集合的范围构造函数。

  • 显示集合的内容。

示例

#include <iostream>
#include <set>
#include <list>
using namespace std;
int main(){
   
   //initializing the list
   list<int> myList = { 30, 70, 56, 89, 67, 44, 23, 37, 18, 92 };
   
   //using the range constructor
   set<int> mySet(begin(myList), end(myList));
   cout<< "The list contents are:" << endl;
   
   //displaying the list contents
   for ( int const &val: myList ) {
      cout << val << ' ';
   }
   cout << "\nThe set contents are:" << endl;
   for ( int const &val: mySet ) {
      cout << val << ' ';
   }
   return 0;
}

输出

The list contents are:
30 70 56 89 67 44 23 37 18 92 
The set contents are:
18 23 30 37 44 56 67 70 89 92 

使用copy函数

C++ 中的 copy 函数允许将数据从一个容器复制到另一个容器。要使用 copy 函数,必须将列表的起始和结束指针以及指向集合和集合开头的指针作为参数传递给函数,这些指针在一个插入器函数中。

语法

list<int> myList;
set<int> mySet;
copy(begin(myList), end(myList), inserter(mySet, begin(mySet)));

算法

  • 将输入放入列表中。

  • 定义一个新的集合。

  • 将列表的起始和结束指针以及指向集合和集合开头的指针(在一个插入器函数中)作为参数传递给 copy 函数。

  • 显示集合的内容。

示例

#include <iostream>
#include <set>
#include <list>
using namespace std;
int main(){
   
   //initializing the list
   list<int> myList = { 33, 74, 52, 84, 65, 47, 28, 39, 13, 96 };
   set<int> mySet;
   
   //using the copy function
   copy(begin(myList), end(myList), inserter(mySet, begin(mySet)));
   cout<< "The list contents are:" << endl;
   
   //displaying the list contents
   for ( int const &val: myList ) {
      cout << val << ' ';
   }
   cout << "\nThe set contents are:" << endl;
   for ( int const &val: mySet ) {
      cout << val << ' ';
   }
   return 0;
}

输出

The list contents are:
33 74 52 84 65 47 28 39 13 96 
The set contents are:
13 28 33 39 47 52 65 74 84 96 

结论

当我们使用集合时,不能向集合中添加或存储重复元素,但列表或类似数组的数据结构允许存储重复元素。在某些情况下,最好使用集合而不是列表。我们之前看到的这些转换技术对此非常有用。

更新于:2022年12月14日

2K+ 浏览量

启动你的职业生涯

通过完成课程获得认证

开始学习
广告