Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在字符串类型崩溃的动态数组中实现擦除 我试图用模板类实现C++中的STL向量,如字符串、int、ulon等类型。下面的擦除函数适用于除字符串以外的所有其他数据类型 template <typename T> void myArr<T>::erase(ULONG index) { if(index >= count) return; T* temp_arr = new T[max_count]; if(index == 0) { memcpy(temp_arr,(arr+1),(count-1)*sizeof(T)); } else if(index == count-1) { memcpy(temp_arr,arr,(count-1)*sizeof(T)); } else { memcpy(temp_arr,arr,(index-1)*sizeof(T)); memcpy(temp_arr+index,arr+index+1,(count-index)*sizeof(T)); } delete[] arr; arr = temp_arr; count--; }_C++_Arrays_String_Memcpy - Fatal编程技术网

在字符串类型崩溃的动态数组中实现擦除 我试图用模板类实现C++中的STL向量,如字符串、int、ulon等类型。下面的擦除函数适用于除字符串以外的所有其他数据类型 template <typename T> void myArr<T>::erase(ULONG index) { if(index >= count) return; T* temp_arr = new T[max_count]; if(index == 0) { memcpy(temp_arr,(arr+1),(count-1)*sizeof(T)); } else if(index == count-1) { memcpy(temp_arr,arr,(count-1)*sizeof(T)); } else { memcpy(temp_arr,arr,(index-1)*sizeof(T)); memcpy(temp_arr+index,arr+index+1,(count-index)*sizeof(T)); } delete[] arr; arr = temp_arr; count--; }

在字符串类型崩溃的动态数组中实现擦除 我试图用模板类实现C++中的STL向量,如字符串、int、ulon等类型。下面的擦除函数适用于除字符串以外的所有其他数据类型 template <typename T> void myArr<T>::erase(ULONG index) { if(index >= count) return; T* temp_arr = new T[max_count]; if(index == 0) { memcpy(temp_arr,(arr+1),(count-1)*sizeof(T)); } else if(index == count-1) { memcpy(temp_arr,arr,(count-1)*sizeof(T)); } else { memcpy(temp_arr,arr,(index-1)*sizeof(T)); memcpy(temp_arr+index,arr+index+1,(count-index)*sizeof(T)); } delete[] arr; arr = temp_arr; count--; },c++,arrays,string,memcpy,C++,Arrays,String,Memcpy,当字符串为数组类型时,程序崩溃,内存访问冲突0x0005。如何为字符串数据类型处理此问题?不能在非普通可复制类型上使用memcpy。std::string不可尝试复制,因此无法在其上使用它 您需要做的是让erase调用特殊版本的erase,具体取决于容器所包含的类型。如果是普通类型,则调用使用memcpy的擦除版本。如果不是,则调用使用for循环并执行简单复制/移动操作的erase版本。对于可能需要将内部数据从一个实例复制到另一个实例的非平凡类型,如std::string,不能使用memcpy。

当字符串为数组类型时,程序崩溃,内存访问冲突0x0005。如何为字符串数据类型处理此问题?

不能在非普通可复制类型上使用memcpy。std::string不可尝试复制,因此无法在其上使用它

您需要做的是让erase调用特殊版本的erase,具体取决于容器所包含的类型。如果是普通类型,则调用使用memcpy的擦除版本。如果不是,则调用使用for循环并执行简单复制/移动操作的erase版本。

对于可能需要将内部数据从一个实例复制到另一个实例的非平凡类型,如std::string,不能使用memcpy。在这种情况下,您需要使用每个元素自己的运算符=,分别复制每个元素,例如:

样板 void myArr::eraseULONG索引 { 如果索引>=计数 回来 T*temp_arr=新T[最大计数]; //在索引之前复制元素。。。 forint i=0;i 样板 void myArr::eraseULONG索引 { 如果索引>=计数 回来 T*temp_arr=新T[最大计数]; //在索引之前复制元素。。。 标准::复制arr、arr+索引、温度arr; //复制索引后的元素。。。 标准::复制arr+索引+1、arr+计数、临时arr+索引; 删除[]arr; arr=温度_arr; -计数; } 或者,由于您的类似乎有一个数组具有容量与计数的概念,因此实际上根本不需要分配新数组,您可以简单地内联修改现有数组,以便在不影响其容量的情况下缩减其计数std::vector::erase基本上就是这样做的:

样板 void myArr::eraseULONG索引 { 如果索引>=计数 回来 //将索引后的元素向下移动一个插槽。。。 标准::复制arr+索引+1,arr+计数,arr+索引; //清除当前未使用的数据的最后一个插槽。。。 arr[count-1]=T; -计数; }
它应该是以null结尾的字符串吗?对于除字符串以外的所有其他数据类型都可以正常工作。你是说std::string吗?如果是这样,memcpy就不会调用复制构造函数。当我使用模板时,如何才能找到它是平凡的还是非平凡的?我的意思是,仅就字符串而言,如何定义不同的函数??当使用copy时,我得到了这个错误-函数调用的参数可能不安全-这个调用依赖于调用方来检查传递的值是否正确。要禁用此警告,请使用-D_SCL_SECURE_NO_警告。有关如何使用VisualC++的“检查迭代器”的文档,尝试定义安全的警告,但仍然存在相同的错误。@ SelyVa见相关特性。并按照编译器所说的去做——阅读相关文档。由于代码使用原始指针,因此它们被视为未经检查的迭代器。所以,要么1不使用不推荐的标准算法,要么2使用适配器。我如何能够单独为非平凡数据类型使用不同的函数?就像我实现的模板一样?