Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.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++;11_C++_C++11_Vector_Iterator_Const Iterator - Fatal编程技术网

C++ 迭代器-c++;11

C++ 迭代器-c++;11,c++,c++11,vector,iterator,const-iterator,C++,C++11,Vector,Iterator,Const Iterator,我不能举例说明这种行为: for (vector<File>::const_iterator it = this->files.begin(); it != this->files.end(); ++it) { if (...) erase(it); // break after, no need of ++it in else branch } for(vector::const_iterator it=this->files.begin();it!=this

我不能举例说明这种行为:

for (vector<File>::const_iterator it = this->files.begin(); it != this->files.end(); ++it) {
    if (...) erase(it); // break after, no need of ++it in else branch
}
for(vector::const_iterator it=this->files.begin();it!=this->files.end();++it){
如果(…)擦除(它);//在之后中断,则不需要在else分支中使用它
}
其中File是我自己的类(std不包括在内),这个->files是文件的向量

当我编译我得到的代码时(参见第2行)

Path.cpp:在成员函数“void Path::rmFile(File&)”中:
Path.cpp:190:24:错误:调用“std::vector::erase(std::vector::const_iterator&)”时没有匹配的函数
Path.cpp:190:24:注:候选人为:
在/usr/include/c++/4.7/vector:70:0中包含的文件中,
从路径h:5开始,
从路径.cpp:1:
/usr/include/c++/4.7/bits/vector.tcc:135:5:注:std::vector::iterator std::vector::erase(std::vector::iterator)[with Tp=File;Alloc=std::Alloc=分配器;std::vector::iterator=u gnu\ucxx:u normal_u迭代器;typename std:vector\ubase::pointer=File*]
/usr/include/c++/4.7/bits/vector.tcc:135:5:注意:参数1从'std::vector::const_iterator{aka}aga}gnu_cxx::_normal_iterator}'到'std::vector::iterator{aka}agu gnu__cxx::_normal_iterator}'没有已知的转换
/usr/include/c++/4.7/bits/vector.tcc:147:5:注:std::vector::迭代器std::vector::erase(std::vector::迭代器,std::vector::迭代器)[带Tp=File;Alloc=std::分配器;std::vector::迭代器=u gnu_cxx::u normal迭代器;类型名std:vector\uBase::pointer=File*]
/usr/include/c++/4.7/bits/vector.tcc:147:5:注意:候选者需要2个参数,提供1个
make:**[Path.o]错误1
甚至错误也表示可以,但是调用std::vector::erase(std::vector::const_迭代器&)时没有匹配的函数,这确实是个错误

我真的需要能够通过迭代器删除向量项。有人能帮我吗?
提前检查。

假设您的示例代码不正确,实际上是
文件。擦除(它)
,然后
const\u迭代器
版本只添加到C++11中,因为您没有使用
auto
,所以看起来您没有该版本

假设您的示例代码不正确,实际上是
文件。擦除(它)
,那么
const\u迭代器
版本只添加到C++11中,因为您没有使用
auto
,所以看起来您没有该版本

这里有三个bug

for (vector<File>::const_iterator it = this->files.begin(); it != this->files.end(); ++it) {
    if (...) erase(it); // break after, no need of ++it in else branch
}
第三个错误是,一旦对集合调用
std::vector::erase
,该集合中的所有迭代器(以及
const_迭代器
s)都将无法使用。这方面的标准术语是
erase
使迭代器无效。(原因是
std::vector
的行为基本上类似于一个大堆分配的缓冲区,在向量上调用
resize
可以执行与在缓冲区上调用
realloc
(1)相同的操作,而调用
erase
可以调用
resize
(因为如果
删除向量中一半的元素,可能会期望堆分配相应地收缩。)

所以,您尝试使用这种朴素的for-loop方法是行不通的。您需要做的是使用标准算法:

#包括
自动谓词=[](常量文件&f){返回f.ShouldBeErasedOrWhatever();}
auto newEndIterator=std::remove_if(this->files.begin(),this->files.end(),谓词);
this->files.erase(newEndIterator,this->files.end());//删除“newEndIterator”之后的所有内容
用原始代码中的“
”替换
f.ShouldBeErasedOrWhatever()
。现在您有了有效的、惯用的C++11,它做的事情是正确的,没有bug



(1)-“等价于<代码> ReloLC/”的注释:当然它不是真正的代码> ReLoLC/;它确实是一种类型安全的过程,它需要调用构造函数和析构函数。<代码> vector > > MycPy < /Cord> C++中的任意对象是不安全的。

< p>这里有三个错误。

for (vector<File>::const_iterator it = this->files.begin(); it != this->files.end(); ++it) {
    if (...) erase(it); // break after, no need of ++it in else branch
}
第三个bug是,一旦对集合调用
std::vector::erase
,该集合中的所有迭代器(以及
const_迭代器
s)都将不可用。标准术语是
erase
使迭代器无效。(原因是
std::vector
的行为基本上类似于一个大堆分配的缓冲区,在向量上调用
resize
可以执行与在缓冲区上调用
realloc
(1)相同的操作,而调用
erase
可以调用
resize
(因为如果
删除向量中一半的元素,可能会期望堆分配相应地收缩。)

所以,您尝试使用这种朴素的for-loop方法是行不通的。您需要做的是使用标准算法:

#包括
自动谓词=[](常量文件&f){返回f.ShouldBeErasedOrWhatever();}
auto newEndIterator=std::remove_if(this->files.begin(),this->files.end(),谓词);
this->files.erase(newEndIterator,this->files.end());//删除“newEndIterator”之后的所有内容
用原始代码中的“
”替换
f.ShouldBeErasedOrWhatever()
。现在您有了有效的、惯用的C++11,它做的事情是正确的,没有bug



(1) –关于“realloc的等价物”的注释这不是真正的代码> RealCalc>代码;它是一种类型安全的进程,它调用移动构造函数和析构函数。<代码> vector < >代码> > MycPy< /COD> C++中的任意对象。hr通过此迭代器。如果要调用
erase
,您已经需要一种非常量方法来访问容器。迭代器m
for (vector<File>::const_iterator it = this->files.begin(); it != this->files.end(); ++it) {
    if (...) this->files.erase(it); // break after, no need of ++it in else branch
}
for (vector<File>::iterator it = this->files.begin(); it != this->files.end(); ++it) {
    if (...) this->files.erase(it); // LOOK OUT, THERE'S STILL A BUG
}
#include <algorithm>

auto predicate = [](const File& f) { return f.ShouldBeErasedOrWhatever(); }
auto newEndIterator = std::remove_if(this->files.begin(), this->files.end(), predicate);
this->files.erase(newEndIterator, this->files.end());  // erase everything after "newEndIterator"