c++不同容器之间的转换
在 C++ 中,不同容器之间的转换主要依赖于标准库的迭代器。大部分标准容器提供了兼容的构造函数或函数接口来从其他容器转换或初始化数据。下面是几种常见容器的转换方式:
1. vector
到 set
的转换
#include <iostream>
#include <vector>
#include <set>
int main() {
std::vector<int> vec = {1, 2, 2, 3, 4};
// 使用 set 的构造函数,将 vector 转换为 set
std::set<int> s(vec.begin(), vec.end());
// 输出 set
for (int elem : s) {
std::cout << elem << " "; // 输出:1 2 3 4 (自动去重)
}
}
- 目的:
std::set
是一种集合,它会自动移除重复元素。 - 转换方式:通过
set
的构造函数,传入vector
的迭代器范围进行转换。
2. set
到 vector
的转换
#include <iostream>
#include <vector>
#include <set>
int main() {
std::set<int> s = {1, 2, 3, 4};
// 使用 vector 的构造函数,将 set 转换为 vector
std::vector<int> vec(s.begin(), s.end());
// 输出 vector
for (int elem : vec) {
std::cout << elem << " "; // 输出:1 2 3 4
}
}
- 目的:将
std::set
转换为std::vector
,保持集合中元素的顺序(按升序)。 - 转换方式:通过
vector
的构造函数,将set
的迭代器范围作为参数。
3. vector
到 list
的转换
#include <iostream>
#include <vector>
#include <list>
int main() {
std::vector<int> vec = {1, 2, 3, 4};
// 使用 list 的构造函数,将 vector 转换为 list
std::list<int> lst(vec.begin(), vec.end());
// 输出 list
for (int elem : lst) {
std::cout << elem << " "; // 输出:1 2 3 4
}
}
- 目的:将
std::vector
转换为std::list
,得到链表结构。 - 转换方式:通过
list
的构造函数,将vector
的迭代器范围作为参数。
4. list
到 vector
的转换
#include <iostream>
#include <vector>
#include <list>
int main() {
std::list<int> lst = {1, 2, 3, 4};
// 使用 vector 的构造函数,将 list 转换为 vector
std::vector<int> vec(lst.begin(), lst.end());
// 输出 vector
for (int elem : vec) {
std::cout << elem << " "; // 输出:1 2 3 4
}
}
- 目的:将
std::list
转换为std::vector
,得到动态数组结构。 - 转换方式:通过
vector
的构造函数,将list
的迭代器范围作为参数。
5. map
到 vector<std::pair>
的转换
#include <iostream>
#include <map>
#include <vector>
int main() {
std::map<int, std::string> m = {{1, "one"}, {2, "two"}, {3, "three"}};
// 使用 vector 的构造函数,将 map 转换为 vector
std::vector<std::pair<int, std::string>> vec(m.begin(), m.end());
// 输出 vector
for (const auto& p : vec) {
std::cout << p.first << ": " << p.second << std::endl;
// 输出:1: one
// 2: two
// 3: three
}
}
- 目的:将
std::map
转换为std::vector
,存储键值对。 - 转换方式:通过
vector
的构造函数,使用map
的迭代器范围。
6. vector
到 unordered_set
的转换
#include <iostream>
#include <vector>
#include <unordered_set>
int main() {
std::vector<int> vec = {1, 2, 2, 3, 4};
// 使用 unordered_set 的构造函数,将 vector 转换为 unordered_set
std::unordered_set<int> uset(vec.begin(), vec.end());
// 输出 unordered_set
for (int elem : uset) {
std::cout << elem << " "; // 输出可能顺序不同,元素:1 2 3 4
}
}
- 目的:将
std::vector
转换为std::unordered_set
,无序存储唯一元素。 - 转换方式:通过
unordered_set
的构造函数,将vector
的迭代器范围作为参数。
7. unordered_map
到 vector<std::pair>
的转换
#include <iostream>
#include <unordered_map>
#include <vector>
int main() {
std::unordered_map<int, std::string> umap = {{1, "one"}, {2, "two"}, {3, "three"}};
// 使用 vector 的构造函数,将 unordered_map 转换为 vector
std::vector<std::pair<int, std::string>> vec(umap.begin(), umap.end());
// 输出 vector
for (const auto& p : vec) {
std::cout << p.first << ": " << p.second << std::endl;
}
}
- 目的:将
std::unordered_map
转换为std::vector
,存储键值对。 - 转换方式:通过
vector
的构造函数,将unordered_map
的迭代器范围作为参数。
总结:
- 大多数 C++ 容器都提供构造函数,允许通过其他容器的迭代器范围来初始化新容器。
- 迭代器是 C++ 容器间相互转换的桥梁,确保数据可以被无缝地复制或移动到不同容器中。