Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.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++_Iterator - Fatal编程技术网

C++ 用C+;中的指针初始化迭代器+;

C++ 用C+;中的指针初始化迭代器+;,c++,iterator,C++,Iterator,我在VC9中构建库时遇到问题,但它以前在VC6中成功构建。 以下是代码的一部分: size_t pos2find; pos2find = J; std::vector<size_t>::iterator it(&pos2find); size\u t pos2find; pos2find=J; std::vector::迭代器it(&pos2find); 下面是错误: error C2664: 'std::_Vector_iterator<_Ty,_All

我在VC9中构建库时遇到问题,但它以前在VC6中成功构建。 以下是代码的一部分:

size_t pos2find;
pos2find = J; 
std::vector<size_t>::iterator it(&pos2find);
size\u t pos2find;
pos2find=J;
std::vector::迭代器it(&pos2find);
下面是错误:

    error C2664: 'std::_Vector_iterator<_Ty,_Alloc>::_Vector_iterator(const std::_Vector_iterator<_Ty,_Alloc> &)' : cannot convert parameter 1 from 'size_t *' to 'const std::_Vector_iterator<_Ty,_Alloc> &'
    1>        with
    1>        [
    1>            _Ty=size_t,
    1>            _Alloc=std::allocator<size_t>
    1>        ]
    1>        Reason: cannot convert from 'size_t *' to 'const std::_Vector_iterator<_Ty,_Alloc>'

1>        with
1>        [
1>            _Ty=size_t,
1>            _Alloc=std::allocator<size_t>
1>        ]
1>        No constructor could take the source type, or constructor overload resolution was ambiguous
错误C2664:'std::_Vector_iterator::_Vector_iterator(const std::_Vector_iterator&'):无法将参数1从'size_t*'转换为'const std:_Vector_iterator&'
1> 与
1>        [
1> _Ty=尺寸,
1> _Alloc=std::分配器
1>        ]
1> 原因:无法从“size\u t*”转换为“const std::_Vector\u iterator”
1> 与
1>        [
1> _Ty=尺寸,
1> _Alloc=std::分配器
1>        ]
1> 没有构造函数可以采用源类型,或者构造函数重载解析不明确
谢谢你的帮助

编辑: 这段代码来自一个名为“surfit”的开源库,它不是我的代码,所以我想这是vector类标准中的一些变化。 迭代器随后用于另一个std函数:

std::vector<size_t>::iterator * ptr_from = fault->sort_by_first_begin;
std::vector<size_t>::iterator * ptr;
ptr = std::lower_bound(ptr_from, 
               fault->sort_by_first_end, 
               it, 
               ptr_size_t_less);
std::vector::迭代器*ptr\u from=fault->sort\u by\u first\u begin;
std::vector::iterator*ptr;
ptr=std::下限(ptr_从,
故障->按首末排序,
信息技术
ptr_尺寸(无尺寸);
编辑: 我想我找到了解决办法。在查看std::lower_bound()之后:

模板
ForwardIterator下界(ForwardIterator first,ForwardIterator last,
常数T和值,比较comp);
将迭代器返回到下限
返回一个迭代器,该迭代器指向排序范围[first,last]中的第一个元素,该元素的比较值不小于value。第一个版本使用运算符<,第二个版本使用comp进行比较。
对于产生预期结果的功能,应根据相同标准(运算符<或comp)对范围内的元素进行排序。

这样,我就消除了it迭代器,使用了下限(first,last,&pos2find,comp);

即使在VC6中,发布的代码也毫无意义。但也许您正在寻找类似的东西

std::vector<size_t>::iterator it = some_vector.begin() + pos2find;
std::vector::iterator it=some_vector.begin()+pos2find;

如果不是,那么你最好多发布一点代码,这样我们就可以看到你是如何使用迭代器的。

向量迭代器不能保证是原始指针。在VS6中,向量::迭代器碰巧是一个
t*
,所以你可以用
t*
初始化迭代器。 在VS的更高版本中,
vector::iterator
的实现被更改为一种类类型(正如它有权做的那样),因此做出错误假设的代码现在无法编译


在任何情况下,您发布的代码都有缺陷,即使
iterator
T*
,因为提供的指针不是指向向量的指针。

原始代码依赖于标准不保证的实现细节,即
std::vector
迭代器可以作为指针实现。我不是当然,这是否仍然如此,但是在Visual C++的后期版本中,实现更改为特定的类模板。 我担心您必须检查所有代码并进行修复,更重要的是,正如已经指出的那样,即使考虑到我刚才所写的内容,您的示例也存在缺陷

注意,对于指针,您可以使用0表示“迭代器未设置”,这与分配
某些向量.end()
不同。如果遇到类似情况,我建议您使用0包装迭代器


在那里,完成了(但使用了不同的编译器)。

以下内容似乎就是我们想要的

std::vector<size_t> tmp;
tmp.push_back(J);
std::vector<size_t>::iterator it = tmp.begin();

std::vector<size_t>::iterator * ptr_from = fault->sort_by_first_begin;
std::vector<size_t>::iterator * ptr;
ptr = std::lower_bound(ptr_from, 
               fault->sort_by_first_end, 
               it, 
               ptr_size_t_less);
std::vector-tmp;
tmp.推回(J);
std::vector::iterator it=tmp.begin();
std::vector::迭代器*ptr\u from=fault->sort\u by\u first\u begin;
std::vector::iterator*ptr;
ptr=std::下限(ptr_从,
故障->按首末排序,
信息技术
ptr_尺寸(无尺寸);

疯狂的代码(迭代器的排序数组,真的吗?)

作为一个一般提示:msvc6是如此残破和预标准化,以至于为其编写的大量代码都无法使用符合标准的编译器进行编译。它甚至不支持适当的for循环变量作用域,直到后来的一个service Pack。我也这么想。但我想可能有一个解决方案。我希望是这样的,但迭代器随后被用于std中更复杂的方法。@Adrian,请参阅我的新解释。是的,这是一个好主意,但我发现我可以用&pos2find替换它。感谢支持。
std::vector<size_t> tmp;
tmp.push_back(J);
std::vector<size_t>::iterator it = tmp.begin();

std::vector<size_t>::iterator * ptr_from = fault->sort_by_first_begin;
std::vector<size_t>::iterator * ptr;
ptr = std::lower_bound(ptr_from, 
               fault->sort_by_first_end, 
               it, 
               ptr_size_t_less);