2016-05-15 4 views
-6

私はコードを持っていますが、それは私が知らないC++です。 しかし、私の考えではC++とJavaには多くの類似点があります。私は、彼らはJavaでそれらを記述する方法/何を意味するのか分からない 唯一のものは、これらは以下のとおりです。ヘルプの任意の種類を事前にJavaへのC++コード、いくつかの質問

u = getNextUglyNumber(twoQ, threeQ, fiveQ, &q); //and what is &q, the &? 

twoQ.push(u << 1); //what is << ? 

std::cout << u << ' '; //this i dont understand at all 

*q = 2; // same as q = 2*q? 

if (fiveQ.front() < u) { 
     u = fiveQ.front(); //whats front? 

どうもありがとう!ここ

はまた、完全なコードである:

typedef std::queue<int> Queue; 
int findNthUglyNumber(int n) { 
    Queue twoQ, threeQ, fiveQ; 
    twoQ.push(2); 
    threeQ.push(3); 
    fiveQ.push(5); 
    int u, q; 
    while (n) { 
     u = getNextUglyNumber(twoQ, threeQ, fiveQ, &q); 
     switch (q) { 
     case 2: 
      twoQ.push(u << 1);   /// u * 2 
     case 3: 
      threeQ.push(u << 2 - u);  /// u * 3 
     case 5: 
      fiveQ.push(u << 2 + u);  /// u * 5 
     } 
     n--; 
     std::cout << u << ' '; 
    } 
    return u; 
} 

int getNextUglyNumber(Queue &twoQ, Queue &threeQ, Queue &fiveQ, int &q) { 
    int u = twoQ.front(); 
    *q = 2; 
    if (threeQ.front() < u) { 
     u = threeQ.front(); 
     *q = 3; 
    } 
    if (fiveQ.front() < u) { 
     u = fiveQ.front(); 
     *q = 5; 
    } 
    switch (*q) { 
    case 2: 
     twoQ.pop(); 
     break; 
    case 3: 
     threeQ.pop(); 
     break; 
    case 5: 
     fiveQ.pop(); 
     break; 
    } 
    return u; 
} 
+3

"C++とJavaの間には多くの類似点がありますが、2つが似ているかもしれないことによって誤解を招くことはありません。実際、彼らは非常に異なっています。 – user463035818

+6

*私の意見ではC++とJavaの間に多くの類似点があります。* - そのような意見は、C++プログラムにつながっていて、バグがあり、非効率的で、メモリが全面に漏れています。 – PaulMcKenzie

+2

some C++チュートリアル[この1つ](http://www.cplusplus.com/doc/tutorial/)(あなたが知らない/理解していることを具体的に調べることができます) – Turing85

答えて

1

最初<<は、C++やJavaで同じである左シフト演算子です。

2 << 5 2は、左5回シフト手段、及び32

std::cout << u << ' '第二<<がC++ストリーム挿入演算子、及びストリームに変数や定数を書き込むために使用されているに等しいです。ここでは、Javaコードと同等です:C++ std::queue

System.out.print(u); 
System.out.print(' '); 

pushfront、およびpop操作、キューの最後に項目を追加するを見て(ただし、削除しないでください)項目でキューの先頭にあるアイテムを削除し、キューの先頭にあるアイテムをそれぞれ削除して返します。次のように彼らは、Java Queueの操作にマップ:C++これを翻訳約

Queue<Integer> fiveQ = new LinkedList<>(); 
fiveQ.add(5); // fiveQ.push(5); in C++ 
fiveQ.peek(); // fiveQ.front(); in C++ 
fiveQ.remove(); // fiveQ.pop(); in C++ 

トリッキーな部分が正確であるようには見えないコード(の&q*q部分であり; Iは、Gでそれをコンパイルすることができない++ 5.3.0)。

C++には、ポインタと参照があります。変数のアドレスを渡したり、そのアドレスを読み取ったり変更したりすることができます。 &の正式な関数パラメータは参照です。 &qという式は、変数qのアドレスを取っています。 *qという表現は、そのアドレスを経由してqを読んで変更しています。あなたはJavaでAtomicIntegerを使用するか、またはMutableIntクラスを書くことができ:

public class MutableInt { 
    private int value = 0; 

    public int get() { 
     return value; 
    } 

    public void set(int value) { 
     this.value = value; 
    } 

    @Override 
    public String toString() { 
     return String.valueOf(value); 
    } 
} 

あなたはその後、qのために、このインスタンスを作成し、それを周りに渡すことができます。その値にアクセスして更新する必要がある関数は、そのようにすることができます。

幸運。