找到一个位置并返回一个迭代器不起作用

时间:2015-01-27 23:14:37

标签: c++ iterator

template<typename T>
void findposition(T t, long value, typename T::iterator &before, typename T::iterator &position) {
        typename T::iterator it = t.begin();
        while(it != t.end()) {
            before = it;
            position = it;
            if(*it > value) {
                if(before != t.begin()) {
                    before = --it;
                }
                break;
            }
            ++it;
        }
    }

vector<long>::iterator itVectorBefore;
vector<long>::iterator itVectorPosition;
findposition(myVector, 31, itVectorBefore, itVectorPosition);
myVector.insert(itVectorPosition, 31);

我不明白为什么这段代码无效。当我运行它时,我将得到分段错误。另一个奇怪的事情是,当du调用findposition(myVector,1,itVectorBefore,itVectorPosition)时。两个迭代器都将保持值为0.我使用gdb进行调查,但我无法找到出错的地方,因为before在函数findposition中具有正确的值。

当你的某个人知道我弄错了什么。我会很高兴得到解释。

谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

  1. 当容器为空时,beforeafter都不会被初始化。

    typename T::iterator it = t.begin();
    while(it != t.end()) { // When the input is empty, nothing
                           // is set to before or after.
    
  2. 返回的迭代器位于输入参数的副本上。

    你应该改变:

    template<typename T>
    void findposition(T t, long value,
                      typename T::iterator &before,
                      typename T::iterator &position) {
    
  3.     template<typename T>
        void findposition(T& t, long value,
                          typename T::iterator &before,
                          typename T::iterator &position) {