1

私がテストしてきたこの非常に単純なリストのどこに問題があるのか​​ 理解できません。アイデアは、リストの位置 i にある項目を取得することです。私は通常、それを行うためにリストを使用しないことを知っています。ただし、これitem = 11item = 12item = 13(出力はそれぞれ になります) を設定すると機能しますが、出力が であるため、at position {1, 2, 3} there's the item {11, 12, 13}を設定すると機能しません。item = 10at position 0 there's the item 6

int main(void)
{
    list<int> L;
    L.push_back(10);
    L.push_back(11);
    L.push_back(12);
    L.push_back(13);

    int item = 10;
    int pos;

    list<int>::iterator it = moveToItem(item, L, pos);

    cout << "at position " << pos << " there's the item " << *it;
}

list<int>::iterator moveToItem(int item, list<int> L, int& pos)
{
     pos = 0;
     list<int>::iterator it = L.begin();

     while(*it != item)
     {
         it++;
         pos++;
     }
     return it;
}
4

3 に答える 3

7

Lが呼び出されたときにリストのコピーが作成されmoveToItem()ているため、返されたイテレータは、list破棄されたのアイテムを参照しています。list代わりに、参照によって渡します。

list<int>::iterator moveToItem(int item, list<int>& L, int& pos)
                                                //^

また、間接参照する前に、条件end()のを超えないように保護する必要があります。listwhileit

これが演習ではない場合はstd::find()std::distance()代わりにSTLアルゴリズムの使用を検討してください。

#include <iterator>
#include <algorithm>

std::list<int>::iterator it = std::find(L.begin(), L.end(), 41);
if (it != L.end())
{
    std::cout << "at position "
              << std::distance(L.begin(), it)
              << " there's the item "
              << *it
              << "\n";
}
于 2012-10-23T09:05:49.527 に答える
0

リストを値で取得しています。したがって、返された反復子は関数のローカルL引数への反復子であるため、関数が返された (そしてL破棄された) と無効になります。参照する必要がありLます:

list<int>::iterator moveToItem(int item, list<int> &L, int& pos)

とにかく、パフォーマンスに関しては、そのような大規模なデータ構造を値によるリストとして取得することは最善の考えではありません。

于 2012-10-23T09:14:00.267 に答える
0

list<int>::iterator moveToItem(int item, list<int> L, int& pos)現在作成されているリストのコピーを呼び出すときは、リストへの参照を渡す必要があります。

list<int>::iterator moveToItem(int item, list<int>& L, int& pos)したがって、あなたの方法は代わりになるはずです。メソッドの本体を同じに保つことができます。

于 2012-10-23T09:07:20.817 に答える