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

时间:2013-06-25 09:49:30

标签: c++ vector stl iterator distance

我有两个typedef:

typedef std::vector<int> Container;
typedef std::vector<int>::const_iterator Iter;

在我考虑的问题中,我在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)一切正常。

我想知道为什么会这样?

2 个答案:

答案 0 :(得分:8)

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

std::distance(Input.cbegin(),itTarget);
                    ^^

请参阅std::vector::cbegin链接

答案 1 :(得分:5)

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

第二种方式: 每个迭代器都可以通过赋值

转换为const_iterator
std::vector<int> myVector(100);
std::vector<int>::iterator it = myVector.begin();
std::vector<int>::const_iterator cit = it;

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

std::distance( ((const Container*)&Input)->begin(), itTarget );

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