gpt4 book ai didi

c++ - 我的代码在 .begin() 作为参数传递时不起作用,但在我将 .begin() 转换为迭代器后起作用

转载 作者:搜寻专家 更新时间:2023-10-31 01:31:36 26 4
gpt4 key购买 nike

我正在尝试创建自己的 vector 类。目前,我正在为我的 vector 类 Vec 添加一个删除函数。当我将 variable.begin() 传递到 erase 函数参数时,我的代码会报错,但在我手动将 variable.begin() 转换为迭代器然后将其传递进去后,我的代码可以正常运行。

有人可以向我解释为什么会出现这种奇怪的情况吗?

int main(){
Vec<string> words;

words.push_back("h");
words.push_back("a");
words.push_back("p");

Vec<string>::iterator iter=words.begin();
Vec<string>::iterator iter1=words.end();
words.erase(words.begin(),words.end());//this does not work
words.erase(iter,iter1);//this works
}
//Function erase in the Vec class i created


template <class T> class Vec {

typedef T* iterator;//
typedef const T* const_iterator;
iterator data; // first element in the Vec
iterator avail; // (one past) the last element in the Vec
iterator limit; // (one past) the allocated memory

void erase(iterator&i, iterator&j){
iterator new_limit=limit;
iterator new_avail=avail;
size_t a=j-i+1;
size_t n=limit-data;
n=n-a;
iterator new_data=alloc.allocate(n);

iterator mid=std::uninitialized_copy(data,data+1,new_data);
size_t b=size();
if(j!=avail){
new_limit, new_avail=std::uninitialized_copy(j+1,avail,mid);
data=new_data;
avail=new_avail;
limit=new_limit;
}
else{
data=new_data;
limit=avail=data+n;
}
}
}

最佳答案

void erase(iterator&i, iterator&j) 的定义相当可疑。

iterator& 意味着你必须有一个现有的变量 bind to the (non-const) reference .迭代器在设计上是“指针等价物”,通常按值传递。你不会写 void erase(string*&i, string*&j)

最简单的解决方案是将erase更改为void erase(iterator i, iterator j)

此外,您还没有将任何东西“转换”为迭代器。您已分配一个迭代器给一个迭代器变量。编译器提示 value-category所涉及的表达式。

关于c++ - 我的代码在 .begin() 作为参数传递时不起作用,但在我将 .begin() 转换为迭代器后起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45433157/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com