首页 > 编程语言 >c++不同容器之间的转换

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

时间:2024-10-15 18:23:37浏览次数:7  
标签:std 容器 set 转换 c++ vector include 构造函数

在 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++ 容器间相互转换的桥梁,确保数据可以被无缝地复制或移动到不同容器中。

标签:std,容器,set,转换,c++,vector,include,构造函数
From: https://www.cnblogs.com/niumachen/p/18468143

相关文章

  • 实验1 现代C++编程初体验
    实验任务1代码#include<iostream>#include<vector>#include<string>#include<algorithm>#include<numeric>#include<iomanip>usingnamespacestd;template<typenameT>voidoutput(constT&c);intrand_int_1......
  • 教你从零开始在MaixCam上部署自己本地训练的Yolov5模型(5)- 转换格式并部署为app
    本博客会从一个从未部署过任何环境的电脑上一步步复现如何本地训练自定义模型并成功部署到Maixcam上实现数字识别的功能。文章中会引用到我当时学习是参考到的文章,都会在下面列出来,在此对这些向我提供过帮助的博主表示感谢!!本文中默认读者已经了解过相对应的知识,一些非常......
  • 实验1 现代C++编程初体验
    一、实验目的体验现代C++标准库、算法库用法灵活组合使用现代C++基础语言特性(数据表示、分支、循环、函数)和标准库,编程解决简单、基础问题编程代码过程中,注意编码素养。关注代码表达,提升代码的可读性、易于维护性二、实验准备系统浏览教材以下章节,对现代c++基础语言特性和......
  • C++的仿函数functor
    C++的仿函数functor详细内容仿函数(Functor)是C++中的一种设计模式,也叫函数对象。仿函数是一个重载了operator()的类或结构体,它可以像普通函数一样被调用。这使得它具有类似函数的行为,但实际上它是一个对象,因此可以拥有状态(成员变量)和更多的灵活性。仿函数的主要用途是:可以......
  • Java 时间格式转换详解
    在Java开发中,时间和日期的处理是非常常见的需求。无论是用户输入的时间数据,还是系统生成的时间戳,我们经常需要对其进行格式化或解析。本文将详细介绍如何在Java中进行时间格式的转换,并分别介绍两种主要的方法:SimpleDateFormat(适用于Java8之前)和 java.time(适用于Java8......
  • 【C/C++】速通某站上的经典“笔试”编程题
    【C/C++】速通某站上的经典“笔试”编程题一.题目描述:解题思路:代码实现:二.题目描述:解题思路:代码实现:三.题目描述:解题思路:代码实现:一.题目描述:解题思路:将区间里面的数依次取模10(%)、除10,作用是大于等于10的数单独拆开(如123,依次拆开为3,2,1),判断是否等于2,如果......
  • lua脚本使用cjson转换json时,空数组[]变成了空对象{}
    一、前言项目lua使用工具:cjson问题:reids中部分数据的jsonkey存在为[]的值,使用cjson进行解析的时候将原本空数组[]解析成了空对象{}目标:原本[] 转[]二、解决方案在使用cjson类库时,先配置json转换要求--设置json转换格式cjson.encode_empty_table_as_object(fal......
  • c++中,经常需要用来获取用户输入的写法,或者暂停【防止终端退出】
    目录1.使用`cin.get()`暂停程序2.使用`std::cin.ignore()`结合`std::cin.get()`暂停程序3.使用`system("pause")`(仅限Windows)4.使用循环和`cin.get()`结合等待任意输入5.使用`cin>>`获取用户输入为了防止终端窗口在程序结束后立即关闭,可以使用一些方......
  • Chromium 中HTML5 WebSocket收发消息分析c++(一)
    一、WebSocket前端接口定义:WebSocket 对象提供了用于创建和管理 WebSocket 连接,以及可以通过该连接发送和接收数据的API。使用 WebSocket() 构造函数来构造一个 WebSocket。构造函数WebSocket(url[,protocols])返回一个 WebSocket 对象。常量ConstantValueWeb......
  • Chromium 中HTML5 WebSocket收发消息分析c++(二)
    看下websocket调用过程:基本定义参考上一篇:Chromium中HTML5WebSocket收发消息分析c++(一)-CSDN博客一、前端测试用例 参考:HTML5WebSocket|菜鸟教程(runoob.com) websocket.html文件如下:<!DOCTYPEHTML><html><head><metacharset="utf-8"><title>Web......