2017-12-23 7 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; '의 조합을주의 깊게 관찰하십시오. 첫 번째 라이브러리는 여러분이 원하거나 필요 이상으로 전체 표준 라이브러리를 포함합니다. 두 번째 라이브러리는'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++에서 벡터를 선언했습니다.

  1. vector <int> myVector;
  2. vector <int> myVector2(4,1000); 당신은 어쩌면이 같이 사용할 수있는 크기를 제공하려면 두 번째는 초기 값 1000 규모 4의 벡터를 초기화합니다. howLong 방법에

    vector <int> myVector(12);