Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.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++ 如何在c++;集装箱?_C++_Algorithm_Vector_Containers - Fatal编程技术网

C++ 如何在c++;集装箱?

C++ 如何在c++;集装箱?,c++,algorithm,vector,containers,C++,Algorithm,Vector,Containers,从我前面的问题:,我尝试通过分配新内存,并将除该擦除之外的所有元素复制到新数组来实现擦除。从答案来看,这不是STL中向量的标准方式,在STL中,向量保持旧元素不变,只在删除旧元素后将其移回(这是以前迭代器“无效”的一部分。因此我尝试使用std::move(): \ifndef\u vec\h #定义向量 #包括 #包括 #包括 模板 Vec类 { 公众: typedef T*迭代器; typedef T*常量迭代器; 类型定义T值_类型; Vec(){ 创建(); } 显式向量(size\u t

从我前面的问题:,我尝试通过分配新内存,并将除该擦除之外的所有元素复制到新数组来实现
擦除
。从答案来看,这不是STL中向量的标准方式,在STL中,向量保持旧元素不变,只在删除旧元素后将其移回(这是以前迭代器“无效”的一部分。因此我尝试使用
std::move()

\ifndef\u vec\h
#定义向量
#包括
#包括
#包括
模板
Vec类
{
公众:
typedef T*迭代器;
typedef T*常量迭代器;
类型定义T值_类型;
Vec(){
创建();
}
显式向量(size\u t n,const t&val=t()){
创建(n,val);
}
矢量控制(常数矢量控制和矢量控制){
创建(v.begin(),v.end());
}
向量和运算符=(常量向量和向量);
~Vec(){
取消创建();
}
T&T操作员[](尺寸i){
返回数据[i];
}
常量和运算符[](大小i)常量{
返回数据[i];
}
无效推回(常数T&val);
大小\u t大小()常量{
返回有效数据;
}
迭代器begin(){
返回数据;
}
常量迭代器begin()常量{
返回数据;
}
迭代器结束(){
回报效用;
}
常量迭代器end()常量{
回报效用;
}
无效清除(){
如果(数据)
{
for(迭代器i=avail;i!=data;i--)
i->~T();
}
avail=数据;
}
分配程序alloc;
私人:
迭代器数据;
迭代器效用;
迭代器极限;
void create();
创建无效(大小、常数和值);
void create(常量迭代器b,常量迭代器e);
void uncreate();
空洞生长();
未选中的无效\u追加(常量T&val);
};
模板向量和向量::运算符=(常量向量和rhs)
{
如果(&rhs!=此)
{
取消创建();
创建(rhs.begin(),rhs.end());
}
归还*这个;
}
模板无效向量::推回(常量T&val)
{
如果(可用==限制)
{
增长();
}
未选中的附加(val);
}
模板void Vec::create()
{
数据=avail=limit=0;
}
模板void Vec::create(大小、常数和值)
{
数据=分配分配(n);
极限=有效=数据+n;
标准:未初始化的填充(数据、限制、val);
}
模板void Vec::create(常量迭代器i,常量迭代器j)
{
数据=分配分配(j-i);
limit=avail=std::未初始化的拷贝(i、j、数据);
}
模板void Vec::uncreate()
{
如果(数据)
{
迭代器i=avail;
while(i!=数据)
{
alloc.destroy(--i);
}
分配解除分配(数据、限额数据);
}
数据=限值=有效值=0;
}
模板void Vec::grow()
{
尺寸(新尺寸=标准::最大值(2*(极限数据),ptrdiff(1));
迭代器new_data=alloc.allocate(新_大小);
迭代器new\u avail=std::未初始化的\u副本(数据、avail、new\u数据);
取消创建();
数据=新数据;
avail=新的_avail;
限制=数据+新尺寸;
}
模板无效向量::未选中的附加(常量T&val)
{
alloc.construct(avail++,val);
}
//---------------------------------------------------------
//这里我尝试用3个指针(数据、可用、限制)实现擦除功能
模板
T*Vec::擦除(T*const i)
{
如果(i==end())
{
返回端();
}
如果(i>=begin()&&i

这仍然会导致segfault。那么有没有办法,如何实现
擦除

编译我需要添加此方法声明:

T* erase(T *const i);
我添加了一些快速测试代码来重新创建segfault:

int main()
{
  Vec<int> test;
  test.push_back(1);
  test.push_back(2);
  test.push_back(3);
  test.push_back(4);
  test.erase(test.begin() + 2);
  std::cout << test[2] << std::endl; // should output 4
}
intmain()
{
Vec试验;
测试。推回(1);
测试。推回(2);
试验。推回(3);
试验。推回(4);
test.erase(test.begin()+2);

std::cout可能会尝试修复此错误…根本不确定这是如何编译的,
return&data[i];
应该是
return i;
…我能看到此编译的唯一方法是如果您根本不使用此Vec::erase(),而是使用其他一些erase()由于意外,这导致了segfaultI尝试使用gcc编译此文件,并得到以下错误:错误:在类'Vec'T*Vec::erase(T*)中未声明'T*Vec::erase(T*const i)成员函数
int main()
{
  Vec<int> test;
  test.push_back(1);
  test.push_back(2);
  test.push_back(3);
  test.push_back(4);
  test.erase(test.begin() + 2);
  std::cout << test[2] << std::endl; // should output 4
}