字符串、内存拷贝

一、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;
}
原文地址:https://www.cnblogs.com/mmmmmmmmm/p/14580284.html