zoukankan      html  css  js  c++  java
  • 字符串、内存拷贝

    一、std::fill

    将一个给定值复制赋值给一个范围内的每个元素

    中文标准库:std::fill

    std::array也有fill()

    std::vector使用fill()之前要分配足够的空间,如果没有足够的空间会发生中断

    示例

        std::vector<int> vec2;
        vec2.resize(6);
        std::fill(vec2.begin(), vec2.begin() + 3, 9); //9,9,9,0,0,0
    

    二、std::fill_n

    将一个给定值复制赋值给一个范围内的 N 个元素

    中文标准库:std::fill_n

    示例

        std::vector<int> vec1;
        vec1.resize(6);
        std::fill_n(vec1.begin()+1, 3, 9); //0,9,9,9,0,0
    

    三、std::copy

    将某一范围的元素复制到一个新的位置

    中文标准库:std::copy

    示例

        std::vector<int> vec1;
        std::vector<int> vec2;
        vec1.resize(6);
        vec2.resize(6);
    
        std::fill_n(vec1.begin()+1, 3, 9); //0,9,9,9,0,0
        std::fill(vec2.begin(), vec2.begin() + 3, 9); //9,9,9,0,0,0
    
        //将vec1从开始的四个元素复制到vec2从第二个位置开始的地方,vec2:909990
        std::copy(vec1.begin(), vec1.begin() + 4, vec2.begin() + 1);
    

    std::copy_if

    迭代器:iterator

        std::vector<int> vec1{ 1,2,3,4,5 };
        std::vector<int> vec2{ 0,9,8,7,6 };
        // vec2:45876,vec1:12345,将vec1中大于3的元素复制到vec2开始的位置
        std::copy_if(vec1.begin(), vec1.end(), vec2.begin(), [](int i) {return i > 3; });
        // vec2:45876345,将vec1大于2的元素从后面添加到vec2
        std::copy_if(vec1.begin(), vec1.end(), std::back_inserter(vec2), [](int i) {return i > 2; });
    

    四、strcpy

    提示函数不安全解决方法

    char *strcpy(char *dest, const char *src)把 src 所指向的字符串复制到 dest。不能保证缓冲区大小,可能会发生不可预料的错误

    示例

        char* ch1 = new char[5]();//ch1为空
        char* ch2 = new char[5];  //ch2是随机值
        const char* ch3 = "abcdefgxyz";
        auto ret1 = strcpy(ch1, ch3); //ch1:"abcdefgxyz",ret1:"abcdefgxyz"
    

    strcpy_s

    只能在VS下使用

    函数原型:

    errno_t strcpy_s(
       char *dest,
       rsize_t dest_size,
       const char *src
    );
    

    成功返回0,其他值失败。

    注意sizeof("12345");的值为6,后面还有一个结束符

    示例

        char ch[8]; //注意给ch初始化
        auto ret = strcpy_s(ch, sizeof(ch), "Hello");//ch = "Hello",ret = 0
    

    五、memcpy

    六、memmove

    七、memset

    完整代码

    #define _CRT_SECURE_NO_WARNINGS
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <array>
    
    int main()
    {
    	//std::vector<int> vec1;
    	//std::vector<int> vec2;
    	//vec1.resize(6);
    	//vec2.resize(6);
    
    	//std::fill_n(vec1.begin()+1, 3, 9); //0,9,9,9,0,0
    	//std::fill(vec2.begin(), vec2.begin() + 3, 9); //9,9,9,0,0,0
    
    	////将vec1从开始的四个元素复制到vec2从第二个位置开始的地方,vec2:909990
    	//std::copy(vec1.begin(), vec1.begin() + 4, vec2.begin() + 1);
    
    	//std::vector<int> vec1{ 1,2,3,4,5 };
    	//std::vector<int> vec2{ 0,9,8,7,6 };
    	//// vec2:45876,vec1:12345,将vec1中大于3的元素复制到vec2开始的位置
    	//std::copy_if(vec1.begin(), vec1.end(), vec2.begin(), [](int i) {return i > 3; });
    	//// vec2:45876345,将vec1大于2的元素从后面添加到vec2
    	//std::copy_if(vec1.begin(), vec1.end(), std::back_inserter(vec2), [](int i) {return i > 2; });
    
    	char* ch1 = new char[5]();//ch1为空
    	char* ch2 = new char[5];  //ch2是随机值
    	const char* ch3 = "abcdefgxyz";
    	const char* ch4 = "ABCDEFG";
    
    	//auto ret1 = strcpy(ch1, ch3); //ch1:"abcdefgxyz",ret1:"abcdefgxyz"
    	//auto ret2 = strcpy_s(ch1, sizeof(ch1), ch3); //error
    	auto ret3 = strcpy_s(ch1, sizeof(ch4), ch4);
    
    
    	int test = 0;
    	return 0;
    }
    
  • 相关阅读:
    移动端HTML5音频与视频问题及解决方案
    git did not exit cleanly
    移动端事件对象touches的误区
    原创:CSS3技术-雪碧图自适应缩放与精灵动画方案
    H5+JS+CSS3 综合应用
    深入理解CSS3 Animation 帧动画
    在 MacOS 中使用 multipass 安装 microk8s 环境
    [译] Design patterns for container-based distributed systems
    Sangmado 公共基础类库
    Redola.Rpc 集成 Consul 服务发现
  • 原文地址:https://www.cnblogs.com/mmmmmmmmm/p/14580284.html
Copyright © 2011-2022 走看看