2011-02-02 13 views
2

イテレータを使用して、リンクされたリストの値を別の外部リンクリスト(現在のメソッドではない)に代入しようとしています。C++イテレータとリンクリスト

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

bLeftと端部が外部リストの(それぞれ)最初と最後であるのに対し、これは、コードの一部のみ、iは一時リストのためのものであるイテレータです。

しかし、上記のコードでは、奇妙なテキストがたくさんあるところがあります(実際にはMicrosoft Windows Compatibleなどについて言われています)、Unixマシンで実行するとSegmentation障害。

EDIT:

#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; 
} 

} 
+0

'bLeft'と' end'はどのように初期化されていますか? – AShelly

+0

おそらく、あなたは 'temp'に十分なメモリを割り当てていないので、' ++ i'は範囲外で実行されます。 –

+0

どのような種類のイテレータを使用していますか? bLeftが指すリストが空の場合、コードは破損します。 –

答えて

2

がループテストをすべきではない:

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

あなたは、私が他のコンテナよりも大きいことを知っていますどのようにここでは、全体のコードはありますか?

+0

または、おそらく 'while((i!= temp.end())&&(bLeft!= end))'です。もちろん、潜在的なコンディションのどれが正しいかは、プレ条件が何であり、所望の事後条件が何であるかに依存する。 –

+0

end()関数はすでに使用しているものよりも使用できません。 – muttley91

3

ほとんどの場合、ソースリストには十分な要素がありません。より多くの情報(または文脈)がなければ、より正確なことはできません。

1

なぜ使用しないのですかstd::list's assign method? 2つのリストのデータが同じタイプであれば、それは本当に必要なものでなければなりません。

+0

私は自分のコードで使用したものを除き、基本的にすべてのリスト関数の使用を制限する大きな制限があります。私はそれらをリストするが、それは長いリストです。 – muttley91

1

assign機能で達成しようとしているように思えます。

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

これは、外部リストに最初から最後までの一時リストの値を割り当てる必要があります。

0

その後一時リストを使用する場合は、std::copyを使用してください。使用していない場合はstd::list.spliceを使用してください。

0

私はエラーを発見したと思います。イテレータを不必要に増やしてしまっています(「end」を不必要に減らすなど)、コードにエラーがありますが、もう少し。

ありがとうございました!