STL迭代器std :: distance()错误

Sim*_*ley 6 c++ iterator stl vector distance

我有两个typedef:

typedef std::vector<int> Container;
typedef std::vector<int>::const_iterator Iter;
Run Code Online (Sandbox Code Playgroud)

在我考虑的问题,我执行一些操作Container Input,在那之后,我想计算std::distance(Input.begin(),itTarget),其中itTarget是的Iter类型.但是我得到了这个编译器错误no instance of function template "std::distance" matches the argument list,并且只有在转换之后,即std::distance(static_cast<Iter>(Input.begin()),itTarget)一切正常.

我想知道为什么会这样?

bil*_*llz 8

std :: distance是一个模板函数,它不能接受不同的参数.你需要使用:

std::distance(Input.cbegin(),itTarget);
                    ^^
Run Code Online (Sandbox Code Playgroud)

看到std :: vector :: cbegin链接

  • @SimonRighley一些C++ 98替代方案:`std :: distance(const_cast <const容器&>(输入).begin(),itTarget)`(或`std :: distance(static_cast <const容器&>(输入).begin( ),itTarget)`如果看到"const_cast"让你害怕),`std :: distance <Iter>(Input.begin(),itTarget)`,当然还有问题中的那个. (2认同)

Mar*_*ius 5

Input.begin()返回一个iterator而不是一个const_iterator,而你的第二个参数是a const_iterator,所以这两个参数基本上是一个不同的类型.cbegin()如果您可以访问C++ 11功能,则可以使用.

第二种方法:每个迭代器都可以通过赋值转换为const_iterator

std::vector<int> myVector(100);
std::vector<int>::iterator it = myVector.begin();
std::vector<int>::const_iterator cit = it;
Run Code Online (Sandbox Code Playgroud)

如果你必须在函数调用中打包,你可以使用一些魔法:

std::distance( ((const Container*)&Input)->begin(), itTarget );
Run Code Online (Sandbox Code Playgroud)

如果Input是const,则编译器被强制使用begin()的const-version,它返回一个const_iterator.