【C++】vector的使用

这篇具有很好参考价值的文章主要介绍了【C++】vector的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、vector的使用

【C++】vector的使用,C++,c++

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <vector>
using namespace std;

void Test1()
{
	vector<int> v1;
	vector<int> v2(10, 15);
	vector<int> v3(v2.begin(), v2.end());

	string str("hello world");
	vector<char> v4(str.begin(), str.end());

	vector<char> v5(v4);

	//[下标]
	for (size_t i = 0; i < v3.size(); i++)
	{
		cout << v3[i] << ' ';
	}
	cout << endl;

	//迭代器
	//vector<char>::iterator it = v4.begin();
	auto it = v4.begin();
	while (it != v4.end())
	{
		cout << *it;
		it++;
	}
	cout << endl;

	//范围for
	for (auto ch : v5)
	{
		cout << ch;
	}
}

void Test2()
{
	vector<int> v;
	//v.reserve(100); //reserve,size没变,还是从0开始
	size_t sz = v.capacity(); //初始容量
	for (int i = 0; i < 100; i++)
	{
		v.push_back(i);
		if (sz != v.capacity())
		{
			sz = v.capacity();
			cout << "扩容:" << sz << endl;
		}
	}
} 

void Test3()
{
	vector<int> v;
	cout << v.max_size() << endl;

	//v.reserve(100); //error【size = 0    capacity 100】
	v.resize(100);    //【size = 100  capacity 100】【只能操控size以内的数据进行赋值、修改等】
	
	for (size_t i = 0; i < 100; i++)
	{
		v[i] = i;
	}

	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
}

void Test4()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);

	for (auto e : v1)
	{
		cout << e << ' ';
	}
	cout << endl;

	//插入
	v1.insert(v1.begin(), 5); //提供的是地址,不是下标,在该位置前插入

	for (auto e : v1)
	{
		cout << e << ' ';
	}
	cout << endl;

	//vector没有提供find,直接用算法库里的
	auto it = find(v1.begin(), v1.end(), 3);
	if (it != v1.end()) //【迭代器传区间都是左闭右开】
	{
		v1.insert(it, 30);
	}

	for (auto e : v1)
	{
		cout << e << ' ';
	}
	cout << endl;

	//删除
	it = find(v1.begin(), v1.end(), 3);
	if (it != v1.end())
	{
		v1.erase(it);
	}
	
	for (auto e : v1)
	{
		cout << e << ' ';
	}
	cout << endl;
}

void Test5()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);

	cout << "v.size() = " << v.size() << endl;
	cout << "v.capacity() = " << v.capacity() << endl;

	v.clear(); //只清数据(size),不清capacity

	cout << "clear后size = " << v.size() << endl;
	cout << "clear后capacity = " << v.capacity() << endl;
}

int main()
{
	Test5();
	return 0;
}

2、vector的OJ题

(1)二叉树的前序遍历

class Solution
{
public:
    void preorder(TreeNode* root, vector<int>& v)
    {
        if (root == nullptr)
        {
            return;
        }
        v.push_back(root->val);
        preorder(root->left, v);
        preorder(root->right, v);
    }

    vector<int> preorderTraversal(TreeNode* root)
    {
        vector<int> v1;
        preorder(root, v1);
        return v1;
    }
};

(2)只出现一次的数字Ⅰ

class Solution
{
public:
    int singleNumber(vector<int>& nums)
    {
        size_t val = 0;
        for (auto e : nums)
        {
            val ^= e;
        }
        return val;
    }
};

(3)杨辉三角

【C++】vector的使用,C++,c++

class Solution
{
public:
    vector<vector<int>> generate(int numRows)
    {
        vector<vector<int>> vv;
        vv.resize(numRows);

        for (size_t i = 0; i < vv.size(); i++)
        {
            vv[i].resize(i + 1);
            vv[i][0] = vv[i][vv[i].size() - 1] = 1;
        }

        for (size_t i = 0; i < numRows; i++)
        {
            for (size_t j = 0; j < vv[i].size(); j++)
            {
                if (vv[i][j] != 1)
                {
                    vv[i][j] = vv[i - 1][j] + vv[i - 1][j - 1];
                }
            }
        }
        return vv;
    }
};

(4)电话号码的字母组合

【C++】vector的使用,C++,c++

class Solution
{
    const char* numStrArr[10] = { "","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz" };
public:
    void combine(string& digits, int i, string combine_str, vector<string>& ret)
    {
        if (i == digits.size())
        {
            ret.push_back(combine_str);
            return;
        }

        int num = digits[i] - '0'; //每次从digits取一个字符转成数字
        string str = numStrArr[num]; //记录该数字对应的字符串

        /*for (int j = 0; j < str.size(); j++)
        {
            combine(digits, i + 1, combine_str + str[j], ret);
        }*/

        for (auto ch : str)
        {
            combine(digits, i + 1, combine_str + ch, ret);
        }
    }

    vector<string> letterCombinations(string digits)
    {
        vector<string> v; //用来存放所有组合结果

        if (digits.empty())
        {
            return v;
        }

        string str; //创建一个空字符串用来存每次的组合结果

        combine(digits, 0, str, v);

        return v;
    }
};

(5)删除有序数组中的重复项

class Solution
{
public:
    //方法1:双指针+vector的使用
    /*int removeDuplicates(vector<int>& nums)
    {
        int slow = 0;
        int fast = 1;
        while (fast < nums.size())
        {
            if (nums[slow] == nums[fast])
            {
                nums.erase(nums.begin() + fast);
            }
            else
            {
                fast++;
                slow++;
            }
        }
        return nums.size(); //返回元素个数
    }*/

    //方法2:双指针
    int removeDuplicates(vector<int>& nums)
    {
        int slow = 0;
        int fast = 1;
        while (fast < nums.size())
        {
            if (nums[fast] == nums[slow])
            {
                fast++;
            }
            else
            {
                slow++;
                nums[slow] = nums[fast];
                fast++;
            }
        }
        return slow + 1; //返回元素个数=下标+1
    }
};

(6)只出现一次的数字Ⅱ

【C++】vector的使用,C++,c++

class Solution
{
public:
    void Swap(int* a, int* b)
    {
        int tmp = *a;
        *a = *b;
        *b = tmp;
    }

    int Partsort(int* a, int left, int right)
    {
        int keyi = left;
        while (left < right)
        {
            //右边先开始
            while (left < right && a[right] >= a[keyi])
            {
                right--;
            }
            //右边找到再找左边
            while (left < right && a[left] <= a[keyi])
            {
                left++;
            }
            Swap(&a[left], &a[right]);
        }
        Swap(&a[left], &a[keyi]);
        return left;
    }

    void nums_Sort(int* a, int begin, int end)
    {
        if (begin >= end)
        {
            return;
        }

        int keyi = Partsort(a, begin, end);
        nums_Sort(a, begin, keyi - 1);
        nums_Sort(a, keyi + 1, end);
    }

    //方法1:【先排序,再3个3个遍历数组】
    int singleNumber(vector<int>& nums)
    {
        //快排
        nums_Sort(&nums[0], 0, nums.size() - 1);

        int result;
        for (int i = 0; i < nums.size(); i += 3)
        {
            //判出界
            if (i + 1 >= nums.size())
            {
                result = nums[i];
                break;
            }

            if (nums[i] != nums[i + 2])
            {
                result = nums[i];
                break;
            }
        }
        return result;
    }

    //方法2:【按位计算】
    /*int singleNumber(vector<int>& nums)
    {
        int result = 0;
        for (int i = 0; i < 32; i++)
        {
            int sum = 0;
            for (int num : nums)
            {
                sum += ((num >> i) & 1);
            }
            if (sum % 3)
            {
                result |= (1 << i); //【|=按位或】
            }
        }
        return result;
    }*/
};

(7)只出现一次的数字Ⅲ

博客:👉【C/C++】x & -x 的含义
防止溢出:

  • INT_MAX = 2^31-1 = 2147483647
  • INT_MIN = -2^31 = -2147483648

【C++】vector的使用,C++,c++文章来源地址https://www.toymoban.com/news/detail-686030.html

class Solution
{
public:
    vector<int> singleNumber(vector<int>& nums)
    {
        //算出所有数异或后的和
        int xorsum = 0;
        for (auto e : nums)
        {
            xorsum ^= e;
        }

        //防止溢出
        //测试用例:[1,1,0,-2147483648],如果对-2147483648取负,那就溢出了
        int lsb = (xorsum == INT_MIN ? xorsum : xorsum & (-xorsum)); //取出xorsum的二进制表示中最低位那个1

        //按L位的不同分成两个组
        int type1 = 0, type2 = 0;

        for (auto f : nums)
        {
            if (f & lsb)
            {
                type1 ^= f; //二进制表示的第L位为1的数
            }
            else
            {
                type2 ^= f; //进制表示的第L位为0的数
            }
        }

        return { type1,type2 };
    }
};

(8)数组中出现次数超过一半的数字

class Solution
{
public:
    int MoreThanHalfNum_Solution(vector<int>& numbers)
    {
        sort(numbers.begin(),numbers.end()); //排序数组
        return numbers[numbers.size()/2]; //取中间元素
    }
};

到了这里,关于【C++】vector的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++学习——vector类的使用

    目录 vector类的介绍: vector类的构造函数:   operator=   operator [ ]    begin end   size resize   capacity reserve   push_back pop_back   insert erase   vector是C++标准模板库中的部分内容,中文偶尔译作“容器”,但并不准确。它是一个多功能的,能够操作多种数据结构和算法的模板类和函数

    2024年02月09日
    浏览(37)
  • [C++]vector的介绍及使用

    目录 C++:vector的使用                 1.vector的定义方式                 2.vector的空间增长                         size和capacity                         reserve和resize                         empty                 3.ve

    2024年02月08日
    浏览(45)
  • 【c++】vector的特性及使用

    目录 一、vector的介绍及使用 1、vector迭代器的使用 2、vector的空间增长 3、vector的迭代器失效问题 二、vector的深度剖析与模拟实现         vector的迭代器就是原生态指针。vector的迭代器使用方法与string的迭代器使用方法相同。         (1)capacity的代码在vs和g++下分别运行会

    2024年01月19日
    浏览(31)
  • C++:vector使用以及模拟实现

    和我们原来讲的string不同, vector并不是类,是一个类模板,加类型实例化以后才是类。 vector是表示 可变大小数组 的序列容器。 像数组一样 ,vector也采用的连续存储空间来存储元素,但是容量可以动态改变。 和其它容器相比,vector访问元素、尾插、尾删较高效,但不在尾部

    2024年02月11日
    浏览(43)
  • 【C++庖丁解牛】STL之vector容器的介绍及使用 | vector迭代器的使用 | vector空间增长问题

    🍁你好,我是 RO-BERRY 📗 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 vector的文档介绍 vector是表示可变大小数组的序列容器。 就像数组一样,vector也采用的连续存储空间来存

    2024年03月14日
    浏览(79)
  • C++【STL】之vector的使用

    vector是表示可变大小数组的序列容器。 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。 本质讲,vector使用动态分

    2024年02月09日
    浏览(50)
  • 【C++】vector的使用及模拟实现

    vector是一个可变大小数组的容器,与数组一样,vector也是一块连续的空间,可以像数组一样对元素进行高效的遍历访问,但是普通数组的大小是不变的,vector可以改变自身大小。vector是采用动态分配数组来存储数据,即插入新元素时要改变存储空间大小,往往要分配一个新的

    2024年01月16日
    浏览(52)
  • C++ [STL之vector的使用]

    本文已收录至《C++语言》专栏! 作者:ARMCSKGT vector是可变大小的数组序列容器,一般也叫向量;底层原理是顺序表,但是vector是泛型容器,可以支持int,double甚至自定义类型的存储,在平时应用非常频繁且广阔,vector在很多场景下可以提高我们的开发效率,所以学习vector这一

    2024年02月06日
    浏览(45)
  • 【C++】vector的使用及其模拟实现

    vector 是表示 可变大小数组的序列容器。 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以 采用下标对vector的元素进行访问 ,和数组一样高效。但是又不像数组, 它的大小是可以动态改变的,而且它的大小会被容器自动处理。 本质讲,vector使用动态

    2024年02月02日
    浏览(41)
  • C++ STL学习之【vector的使用】

    ✨个人主页: Yohifo 🎉所属专栏: C++修行之路 🎊每篇一句: 图片来源 The power of imagination makes us infinite. 想象力的力量使我们无限。 vector 是表示可变大小数组的序列 容器 ,其使用的是一块 连续 的空间,因为是动态增长的数组,所以 vector 在空间不够时会扩容; vector 优点

    2023年04月09日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包