2017-12-23 9 views
-1

私は非循環有向グラフで最長の経路を見つけるためにTopCoderでproblemを行っていました。私は訪問頂点のために型bool型のベクトルを使用しました。しかし、それは私に(以下のコードで強調表示)これらのエラーを与えている:bool型のベクトルにtrueまたはfalseを代入すると、下のプログラムでエラーが表示されるのはなぜですか?

error: no match for ‘operator=’ (operand types are ‘std::vector<bool>’ and ‘bool’) 
visited[cur_ver]=true; 

error: no match for ‘operator==’ (operand types are ‘std::vector<bool>’ and ‘bool’) 
      if(visited[i]==false) 

ここに私のコードです:あなたは、組み込みの配列構文とstd::vector<T>クラスの構文を混乱さ

#include<bits/stdc++.h> 
using namespace std; 
class Circuits{ 
    vector<int>adj[51]; 
    vector<int>cost[51]; 
    vector<int>T[51]; 
    vector<bool>visited[51]; 
    vector<int>dist[51]; 
    int glm=0; 
public: 
    void topological_sorting(int cur_ver,int n){ 
     visited[cur_ver]=true;      //error 1 
     for(int i=0;i<adj[cur_ver].size();i++){ 
      if(visited[i]==false)     //error 2 
       topological_sorting(i); 
     } 
     T.insert(T.begin(),cur_ver); 
    } 

    void Longest_Path(int s,int n){ 

     for(int i=0;i<=n;i++) 
      dist[i]=NINF; 
      dist[s]=0; 
     for(int i=0;i<=n;i++){ 
      int u=T[i] 
      if(dist[u]!=NINF) 
       for(int j=0;j<adj[i].size();j++){ 
        int v=adj[u][j]; 
        if(dist[v]<dist[u]+cost[u][v]) 
         dist[v]=dist[u]+cost[u][v]; 
       } 
     } 
     for(int i=0;i<=n;i++) 
      if(dist[i]>glm) 
       glm=dist[i]; 
} 

int howLong(vector<string>connects,vector<string>costs){ 
    for(int i=0;i<connects.size();i++){ 
     for(int j=0;j<connects[i].size();j++){ 
      adj[i].push_back(int(connects[i][j])); 
      cost[i].push_back(int(costs[i][j])); 
     } 
    } 
    int n=connects.size(); 
    for(int i=0;i<=n;i++) 
     visited[i]=false; 
    topological_sorting(0,n); 
    int lm=0; 
    for(int i=0;i<=n;i++){ 
    Longest_Path(i,n); 
    if(glm>lm) 
     lm=glm; 
     glm=0 
    } 
return lm; 
} 
}; 
+1

あなたは、将来の質問のために、整数 –

+1

ヒントに要素を推進している:ダウン疑わしい動作を再現するために必要な最小限のコードに例をカット。意味のあるものは何もする必要はありません。あなたの質問に簡単に答えることができます - そして、あなた自身が問題を見つけ出すことにつながる便利なデバッグテクニックです。 – DevSolar

+1

は関係ありませんが、 '#include 'と 'using namespace std; 'の組み合わせを注意してください。最初のものは標準ライブラリ全体を含みます。 2番目のライブラリは 'std'名前空間のすべてを、標準ライブラリのほとんどすべてを取り出し、それをグローバルな名前空間に置きます。そこでは、あなたが書いたものの方法で得ることができます。一緒に使用していない数万の識別子があなたの識別子の中に入り、これは非常に奇妙なエラーメッセージとロジック問題を引き起こします。 – user4581301

答えて

4

が。正確には、

std::vector<int> myVec[51] 

であなたが宣言し、int型の51個のベクトルの配列。したがって、コード

visited[cur_ver]=true; 

「は配列myVecの要素52を取り、それにtrueを割り当てる」を意味します。ただし、その要素のタイプはboolではなく、std::vector<int>です。ベクトルオブジェクトにboolの値を代入する演算子はありません。

あなたの意図であるベクトルのサイズを指定するには、適切なコンストラクタまたはresize()メソッドを使用します。コンパイル時にコンテナのサイズが固定されていることが分かっている場合は、C++ 11で使用可能な固定長の配列コンテナであるstd::array<size_t, T>を使用することができます。しかし、あなたのコードではそうではありません。後で要素を挿入します。

したがって、エラーを修正するには、ベクトル宣言の構文を修正して、自分のクラスのコンストラクタにサイズを変更:

vector<int> adj; 
// other vectors follow ... 
// in Circuit::Circuit: 
Circuit:Circuit() { 
    adj.resize(51); // others follow ... 
} 

が適切という定数で51を置き換えてください。 「マジック」定数は悪いです!

+0

ありがとう –

0

ベクトルは、サイズ変更可能なダイナミックアレイと似ています。 C++でのベクトルの宣言には2つの方法しかありません。

  1. vector <int> myVector;
  2. vector <int> myVector2(4,1000); あなたは多分あなたはこのように使用することができる大きさを提供したい場合は、2番目は、初期値1000でサイズ4のベクトルを初期化します。 howLong法で

    vector <int> myVector(12); 
    
関連する問題