c++不同容器之间的转换

在 C++ 中,不同容器之间的转换主要依赖于标准库的迭代器。大部分标准容器提供了兼容的构造函数或函数接口来从其他容器转换或初始化数据。下面是几种常见容器的转换方式:

1. vectorset 的转换

#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. setvector 的转换

#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. vectorlist 的转换

#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. listvector 的转换

#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. mapvector<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. vectorunordered_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_mapvector<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++ 容器间相互转换的桥梁,确保数据可以被无缝地复制或移动到不同容器中。
posted @ 2024-10-15 18:27  牛马chen  阅读(47)  评论(0编辑  收藏  举报