2017-05-23 3 views
0
#include <iostream> 
#include <string> 
#include <vector> 
#include <algorithm> 
#include <climits> 

using namespace std; 

vector<long long> count_inv(vector<long long> &left, vector<long long> &right, int &count); 

vector<long long> split(vector<long long> &A, int &count) 
{ 
    if (A.size() == 1) 
     return A; 
    else 
    { 
     int mid = A.size()/2; 
     int umid = A.size() - mid; 
     vector<long long> *left, *right; 
     left = new vector<long long>(mid); 
     right = new vector<long long>(umid); 
     for (int i = 0;i < mid;i++) 
      *left[i] = A[i]; 
     for (int i = mid, j = 0;i < A.size();i++, j++) 
      *right[j] = A[i]; 
     split(*left, count); 
     split(*right, count); 
     left->push_back(LLONG_MAX); 
     right->push_back(LLONG_MAX); 
     vector<long long> C = count_inv(*left, *right, count); 
     return C; 
    } 
} 

vector<long long> count_inv(vector<long long> &left, vector<long long> &right, int &count) 
{ 
    vector<long long> *merged; 
    merged = new vector<long long>(left.size() + right.size() - 2); 
    int i = 0, j = 0, k = 0; 
    while (i + j != left.size() + right.size() - 2) 
    { 
     if (left[i] < right[j]) 
     { 
      *merged[k] = left[i]; 
      i++;k++; 
     } 
     else if (left[i] > right[j]) 
     { 
      *merged[k] = right[j]; 
      j++;k++;count++; 
     } 
     else 
     { 
      *merged[k] = left[i]; 
      *merged[k + 1] = right[j]; 
      i++;j++;k += 2; 
     } 
    } 
    return *merged; 
} 

int main() 
{ 
    ios_base::sync_with_stdio(false); 
    cin.tie(NULL); 

    int t; 
    cin >> t; 
    while (t--) 
    { 
     cout << endl; 
     int n; 
     cin >> n; 
     vector<long long> A(n); 
     for (int i = 0;i < n;i++) 
      cin >> A[i]; 
     int count = 0; 
     vector<long long> S = split(A, count); 
     cout << count << endl; 
    } 

    return 0; 
} 

必要ないくつかの動的なメモリ割り当て上記のコードで動的に割り当てられたメモリを扱うとき、私のコンパイラは私にエラーを与えるということですので、私はC++で新しいキーでそうした、しかし、コンパイラは私に次のようになりますすべての行でエラーはなぜC++

Severity Code Description Project File Line Suppression State 
Error (active) E0349 no operator "*" matches these operands 

は、私は、すなわちライン23,25,44,49,54,55に、動的に割り当てられたメモリを欽慕する「*」を使用しました。

+1

まもなくベクトルは、オブジェクトが、アレイと操作するためのインタフェースではありません。 – user3811082

+1

通常、 'new vector'は必要ありません。あなたは確かにこのプログラムでそれを必要としません。 'std :: vector'をポインタなしで直接使用するように書き直してください。 –

答えて

2

だから、あなたが見ている特定の問題についての説明は、あなたがいると思うオペレータでポインタを逆参照していないということです。

*left[i] 

これは、コンパイラが想定しているの_i_th要素を取りますvector<long long>の配列であり、その後、単なる*で逆参照しようとしますが、これは明らかに動作しません。これを簡単にブラケットで修正することができます:(*left)[i]

ただし、コードに深刻な問題があります。 newでヒープ上の標準コンテナを割り当てることは、C++標準ライブラリの使い方を理解していない人のしるしであることがよくあります。あなたはと言っていますが、上記のコードでは、いくつかの動的メモリ割り当てが必要です。しかしこれはおそらく真実ではありません!

はこれを見てください:

vector<long long> count_inv(vector<long long> &left, vector<long long> &right, int &count) 
{ 
    vector<long long> merged(left.size() + right.size() - 2); 
    // snip 
    return merged; 
} 

と、それだけで同様に動作します:

vector<long long> count_inv(vector<long long> &left, vector<long long> &right, int &count) 
{ 
    vector<long long> *merged; 
    // snip 
    merged = new vector<long long>(left.size() + right.size() - 2); 
    return *merged; 
} 

が、これはメモリリークが発生することが起こっている、あなただけの代わりにこれを行うことができたという事実をともかく。おそらく標準的なコンテナを使用する最良の方法を学ぶためにもう少し時間を費やすことができます。

+0

あなたは同じもののための完了リソースを提案できますか? – zaidjan1295

+0

私には良い提案はありませんが、このテーマについてたくさんの意見を持っている人たちには、そこにたくさんのコーディングフォーラムがあります。あなたがまだ1人のメンバーでないなら、それはやる価値があるかもしれません。 – Rook

3

オペレータ[]は、オペレータ*よりも高いprecedenceです。だから*left[i]は、 "からまでのインデックスを取り、leftから索引を外す"という意味です。あなたが実際に望んでいたのは、「逆参照left」であり、その結果からインデックスiを取得しました。代わりに(*left)[i]と表示されます。

他のベクターのポインタのための同じ:(*right)[i](*merged)[i]

もののは、本当に、動的にここに割り当てられ、あなたがどんな対応するdelete Sなしnewを呼び出しているので、あなたがメモリをリークしているを使用する理由はありません。あなたはベクトルCのために、すでにそうであるようにあなたが機能splitcount_inv、以上の分別から復帰する前にdeleteに動的に割り当てられたvectorオブジェクトを必要とするいずれか、ただ、ベクトルleft、自動(ローカル)変数としてrightmergedを定義します。

0

他の人が指摘しているように、基本的な構文上の問題は、*symbol[i]がどのように解釈されるかについてのあなたの前提が正しくないということです。私が何年もやったように、演算子優先順位テーブルを印刷して、コードを書いている場所であれば、目のレベルに投稿することはうまくいくかもしれません。ここ

屋のためのものである:http://en.cppreference.com/w/cpp/language/operator_precedence