C ++迭代器和链接列表

时间:2011-02-02 20:14:47

标签: c++ iterator

所以我试图使用迭代器将一个链表的值分配给另一个外部链表(不在当前方法中)。

LIST_ITER i = temp.begin();
while(bLeft != end)
{
    *bLeft = *i;
    ++i;
    ++bLeft;
}

这只是代码的一部分,迭代器i用于临时列表,而bLeft和end是外部列表的开头和结尾。

然而,上面的代码产生了一个奇怪的错误,我得到了一堆奇怪的文本(其中一些实际上说的是关于Microsoft Windows兼容等等),当在Unix机器上运行时只会出现分段错误

编辑:以下是完整的代码:

#include <iostream>
#include <list>
#include <string>
#include <iterator>

using namespace std;

typedef list<string> LIST;                            // linked list type
typedef LIST::size_type LIST_SIZE;              // size type for list, e.g., unsigned
typedef LIST::iterator LIST_ITER;                 // iterator type
typedef LIST::value_type LIST_CONTAINS;   // type in the list, i.e., a string

void merge_sort(LIST_ITER beg, LIST_ITER end, LIST_SIZE sz);
void merge(LIST_ITER bLeft, LIST_ITER bRight, LIST_ITER end);

int main()
{
LIST l;
LIST_CONTAINS v;
// Read in the data...
while (cin >> v)
l.push_back(v);
// Merge the data...

LIST_ITER i = l.begin();
LIST_ITER iEnd = l.end();
merge_sort(i, iEnd, v.size());
// Output everything...
for (; i != iEnd; ++i)
{
    cout << *i << '\n';
}
system("pause");
}

void merge_sort(LIST_ITER beg, LIST_ITER end, LIST_SIZE sz)
{
if(sz < 2)
{
    return;
}
else
{
    LIST_SIZE halfsz = (distance(beg, end)/2); //half of list size
    LIST_ITER i1End = beg; //iterator for the end of the first list
    advance(i1End, halfsz); //advance to the midpoint
    i2 = i1End++; //iterator for the beginning of the second list
    --end;//iterator for the end of the second list

    merge_sort(beg, i1End, halfsz); //recursively pass first list
    merge_sort(i2, end, halfsz); //recursively pass second list     
}
merge(beg, i2, end);
}

void merge(LIST_ITER bLeft, LIST_ITER bRight, LIST_ITER end)
{

LIST temp;
LIST_ITER beg = bLeft;
LIST_ITER halfw = bRight;
LIST_ITER i = temp.begin();


while(beg != bRight && halfw != end)
{
    if(*beg < *halfw)
    {
        temp.push_back(*halfw);
        halfw++;
    }
    else
    {
        temp.push_back(*beg);
        beg++;
    }   
}

while(beg != bRight)
{
    temp.push_back(*beg);
    beg++;
}
while(halfw != end)
{
    temp.push_back(*halfw);
    halfw++;
}

while(bLeft != end) ///HERE IS THE PREVIOUSLY POSTED CODE
{
    *bLeft = *i;
    ++i;
    ++bLeft;
}

}

6 个答案:

答案 0 :(得分:3)

最可能的原因是源列表中没有足够的元素。但是,如果没有更多信息(或上下文),就不可能更精确。

答案 1 :(得分:2)

循环测试不应该是:

while (bLeft != end && i != temp.end())

你怎么知道我比另一个容器大?

答案 2 :(得分:1)

为什么不使用std::list's assign method?如果两个列表中的数据属于同一类型,那真的应该是你需要的全部,不是吗?

答案 3 :(得分:1)

似乎可以使用assign函数完成您要完成的任务。

exterior.assign(temp.begin(), temp.end());

这应该从开始到结束为外部列表分配临时列表的值。

答案 4 :(得分:0)

如果您之后要继续使用临时列表,请使用std::copy。如果不是,请使用std::list.splice

答案 5 :(得分:0)

我想我已经发现了错误,它与我如何不必要地增加了一些迭代器(例如不必要地减少“结束”)和我的代码仍有错误有关但我需要经历它还有一些。

感谢您的建议!