5

私は少しJavaのバックグラウンドを持つC++を学ぼうとしており、2つのリストの共通部分を返すコードを書こうとしています。概念的には正しい考えを持っていると思いますが、何もコンパイルされていないため、構文に問題があります。

これが私が思いついたコードです:

#include <iostream>
using namespace std;
#include <list>

template <typename Object>
list<Object> intersection( const list<Object> & L1, const list<Object> & L2){

  std::list<Object> result;                 
  int pos1 = 0;
  int pos2 = 0;

  while (pos1 < L1.size() && pos2 < L2.size()) {
    if (L1[pos1] > L1[pos2]) {
      pos1++;
    } else if (L2[pos2] > L1[pos1]) {
      pos2++;
    } else {
      result.push_back(L2[pos2]);
      pos1++;
      pos2++;
    }
  }
  return result;

}

私が必要だと思うもの:イテレータ(リストにアクセスする方法が正しくないと確信しています)

4

2 に答える 2

5

pos1 と pos2 を反復子に変更します。

list<Object> intersection( const list<Object> & L1, const list<Object> & L2){
  std::list<Object> result;                 
  std::list<Object>::iterator pos1 = L1.begin(), pos2 = L2.begin();
  while (pos1 != L1.end() && pos2 != L2.end()) {
     if (*pos1 > *pos2) { //works only if pos1 != L1.end() and pos2 != L2.end()
       pos1++;
       ...

pos1 = L1.begin()pos1の最初の要素を指しL1ます。

++pos1イテレータを次の要素に移動します

*pos1から要素を取得しますpos1

pos1 != L1.end()pos1リストの最後に到達したかどうかを確認します。pos1whenから要素を取得することはできませんpos1 == L1.end()

于 2013-03-04T07:55:05.877 に答える
2

const_iteratorではないが必要ですiterator

すべての C++ コンテナー クラスにtypedef、含まれる型やイテレーター型などを定義するs があります。

あなたの場合list<Object>::value_typeはタイプObjectです。したがって、次のように言えます。

list<Object>::value_type object = Object();

同様にlist<Object>::iterator、コンテナをトラバースするために使用されるイテレータの型です。begin()andを使用して、コンテナーの開始と終了を表す反復子を取得できますend()

あなたのコンテナがconstあなたの質問と同じで、beginend が返されない場合はiterator、返されconst_iteratorます。これを型に割り当てることはできませんiterator。値を変更できるものと変更できないものがあります。

を使用して問題を解決できますconst_iterator。ただし、これを修正する方法は他にもいくつかあります。

  • auto型について明示する必要がないことを意味します。それはあなたにとって正しいことをします。
  • テンプレートは汎用パラメーターを使用できるため、ここでも明示的である必要はありません。
  • 標準ライブラリには、すでに必要なことを実行している可能性のあるさまざまなアルゴリズムがあります (例: set_intersection)。
于 2013-03-04T09:15:44.140 に答える