当前位置: 首页 > article >正文

c ++零基础可视化——vector

c ++零基础可视化——vector

初始化
vector<int> v0(5);         // 0 0 0 0 0
vector<int> v1(5, 1);      // 1 1 1 1 1
vector<int> v2{1, 2, 3}    // 1 2 3
vector<int> v3(v1);        // 1 1 1 1 1
vector<vector<int>> v4(2, vector<int>(8, 3));   
//   3 3 3 3 3 3 3 3
//   3 3 3 3 3 3 3 3
auto v5 = vector(2, vector<int>(8, 3));
//   3 3 3 3 3 3 3 3
//   3 3 3 3 3 3 3 3

启发:使用auto可以更好对二位vector进行初始化。

赋值运算,比较运算
vector<int> v0{1, 2, 3};
vector<int> v1;
v1 = v0;
vector<int> v2{1, 2, 4};
v0 < v2;

比较大小:按字典序比较。

vector常用成员函数

v.front()获取vector的第一个元素

v.back()获取vector的最后一个元素

v.size()获取vector的元素个数

v.empty()判断vector是否为空

v.clear()清空vector的数据

v.push_back()将数据塞入vector的末尾

v.pop_back()将数据从vector的末尾移除

v.resize(3)重新定义vector的大小。若比原先小,则删除末尾元素;若比原先大,则用0填充新增的元素;v.resize(5, 1)若有第二个参数,则用第二个参数来填充

v.begin()

v.end()

以下示例仅代表用法,并不是对同一数组进行连续操作,而代表的是每次都对最上面的数组进行操作,即不考虑之前对数组操作的语句对数组的改变。以此来演示语法规则。

vector<int> v{1, 2, 3, 4, 5};
v.erase(v.begin()); //删除1,得到2 3 4 5
v.erase(v.begin() + 1, v.end() + 3) //删除2 3,得到1 4 5    
vector<int> v{1, 2, 3};
v.insert(v.begin(), 4);  //插入4,得到4 1 2 3
v.insert(v.begin + 1, {4, 5, 6});  //插入4 5 6,得到 1 4 5 6 2 3
vector<int> v1(1, 2, 3);
vector<int> v2(4, 5, 6);
v1.insert(v1.end(), v2.begin(), v2.end()); //插入 4 5 6,得到 1 2 3 4 5 6
题目一:https://www.luogu.com.cn/problem/B3688
#include <bits/stdc++.h>

using namespace std;

using LL = long long;

#define endl "\n"

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;
    vector<int> nums(n);
    for(auto& x : nums) cin >> x;

    do {
        int back = nums.back();
        nums.pop_back();
        nums.insert(nums.begin(), back);
        for(auto& x : nums) cout << x << " ";
        cout << endl;
    }while(nums.back() != n);


    return 0;
}

启发:使用do while语句可以完美契合题意;注意精简代码。

问题二:https://www.luogu.com.cn/problem/B3849
#include <bits/stdc++.h>

using namespace std;

using LL = long long;

#define endl "\n"

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, R;
    cin >> n >> R;

    vector<int> digit;
    while(n) {
        digit.push_back(n % R);
        n /= R;
    }
    reverse(digit.begin(), digit.end());
    for(auto& x : digit) {
        if(x < 10) {
            cout << x;
        } else {
            cout << char(x - 10 + 'A');
        }
    }
    return 0;
}

启发:隐式转换;如何取出数字的每一位。

问题三:https://www.luogu.com.cn/problem/B3766
#include <bits/stdc++.h>

using namespace std;

using LL = long long;

#define endl "\n"

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, T;
    cin >> n >> T;

    vector<int> nums(n);
    vector<int> newNums;

    for(auto& x : nums) {
        cin >> x;
    }

    while(T --) {
        int k;
        cin >> k;
        for(int i = 0; i < k; i ++) {
            for(int j = i; j < n; j += k) {
                newNums.push_back(nums[j]);
            }
        }
        nums = newNums;
        newNums.clear();
    }

    for(auto& x : nums) {
        cout << x << " ";
    }

    return 0;
}

启发:每次选人相当于分成k组。比如:当k = 2时,就会先选出索引为0 2 4 6 8…的人,再选出1 3 5 7 9…的人,先选出来的排在前面,后选出的排在后面。对题面的理解:每次选出的人都应该在第一个人的索引上加上k的倍数。

每次排出新的队伍,就保存在newNums中,再将新队伍newNums赋值给nums,最后将newNums清空。

要加深对数学型题面的理解。本题面加深了我的理解力。

问题四:https://www.luogu.com.cn/problem/B3745
#include <bits/stdc++.h>

using namespace std;

using LL = long long;

#define endl "\n"

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m, r;
    cin >> n >> m >> r;
    vector<int> f1(n), p1(n), f2(n), p2(n);
    for(auto& x : f1) cin >> x;
    for(auto& x : p1) cin >> x;
    for(auto& x : f2) cin >> x;
    for(auto& x : p2) cin >> x;
    
    while(n --) {
        int order;
        cin >> order;
        order --;
        int idx = -1;
        for(int i = 0; i < f2.size(); i ++) {
            if(f2[i] == f1[order] && p2[i] > p1[order]) {
                if(idx == -1 || p2[i] < p2[idx]) {
                    idx = i;
                }
            }
        }
        if(idx != -1) {
            f2.erase(f2.begin() + idx);
            p2.erase(p2.begin() + idx);
        }
    }
    cout << f2.size() << endl;
    return 0;
}
#include <bits/stdc++.h>

using namespace std;

using LL = long long;

#define endl "\n"

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m, r;
    cin >> n >> m >> r;
    vector<int> p1(n), f1(n), p2(n), f2(n);
    vector<int> output(n);

    for(int i = 0; i < n; i ++) {
        cin >> f1[i];
    }
    for(int i = 0; i < n; i ++) {
        cin >> p1[i];
    }
    for(int i = 0; i < n; i ++) {
        cin >> f2[i];
    }
    for(int i = 0; i < n; i ++) {
        cin >> p2[i];
    }
    for(int i = 0; i < n; i ++) {
        cin >> output[i];
    }
    int cnt = 0;
    for(int i = 0; i < n; i ++) {
        int outF = f1[output[i] - 1], outP = p1[output[i] - 1];
        vector<pair<int, int>> temp;
        for(int j = 0; j < n; j ++) {
            if(f2[j] == outF && f2[j] != -1 && p2[j] > outP) {
                temp.push_back({f2[j], p2[j]}); // F P
            }
        }
        int maxMin = 101;
        for(auto& x : temp) {
            if(x.second > outP && x.second < maxMin) {
                maxMin = x.second;
            }
        }
        if(maxMin != 101) {
            for(auto& x : temp) {
                if(x.second == maxMin) {
                    for(int k = 0; k < n; k ++) {
                        if(f2[k] == x.first && p2[k] == x.second) {
                            f2[k] = p2[k] = -1;
                            break;
                        }
                    }
                    break;
                }
            }
            cnt ++;
        }
        temp.clear();
    }
    cout << n - cnt << endl;
    return 0;
}

启发:模拟题,题目不难,显然上面的代码精简。但我的方法很冗长复杂,究其原因还是没有熟练掌握vector的精髓之处。我与其对比,纵观我的代码,我总是想要存储数据,但这完全不必要。而且应用的函数也很少,总是用push_back()。这导致我的方法不够好。


http://www.kler.cn/a/403738.html

相关文章:

  • 【生成数据集EXCEL文件】使用生成对抗网络GAN生成数据集:输出生成数据集EXCEL
  • 链表续-8种链表(数据结构)
  • Makefile 之 自动化变量
  • 关于一次开源java spring快速开发平台项目RuoYi部署的记录
  • Spring Cloud Stream实现数据流处理
  • 【代码随想录】贪心
  • WebSocket详解、WebSocket入门案例
  • React渲染流程与更新diff算法
  • AMD(Xilinx) FPGA配置Flash大小选择
  • Linux:权限相关知识详解
  • 基于yolov8、yolov5的茶叶等级检测识别系统(含UI界面、训练好的模型、Python代码、数据集)
  • hhdb数据库介绍(9-26)
  • 当mysql的slave无法同步master数据时,如何基本不断业务重置主从同步关系
  • MySQL社区版的启动与连接
  • 数据集-目标检测系列- 花卉 鸡蛋花 检测数据集 frangipani >> DataBall
  • TensorFlow 2.0 windows11 GPU 训练环境配置
  • Unity3D空中突袭(1)场景导入
  • 全面认识AI Agent,一文读懂AI智能体的架构指南
  • Qlik Sense QVD 文件
  • i春秋-Look(sql字符集、超短sql注入、写入shell)
  • [毕业设计]最全计算机专业毕业设计选题推荐汇总(源码+论文)
  • 稳联技术通讯Modbus转 EtherNet IP 网关 在机场行李运输系统中的应用
  • 【前端】将nuxt.js项目部署到域名二级目录下
  • FPGA上板项目(五)——UART测试,串口发送
  • 中间件--laravel进阶篇
  • 网络安全、Web安全、渗透测试之笔经面经总结