2014-10-02 1 views
4

나는 녹슨 초보자입니다. 나는 (char, int) {Vertex name, cost}의 Vector에 char {vertex name}의 HashMap으로 지시 그래프의 인접 목록을 표현하려고합니다. 나는 마지막 HashMap을 불변으로하고 싶지만, 벡터를 만들고 싶다. 그리고 불변으로 만들 수있는 복사본을 만들 필요가 없다.녹에서 벡터의 HashMap을 만드는 방법은 무엇입니까?

내 코드는 다음과 같습니다. 표시된 줄에서 "변경할 수없는 참조 해제 (참조로 암시적임, 색인 작성 때문에)를 변경할 수 없습니다"라는 메시지가 나타납니다. 지도에서 Vec < (char, int)>을 변경할 수 없으므로 의미가 있습니다. 하지만 어떻게 수정해야할지 모르겠습니다.

녹에서 어떻게 할 수 있습니까?

fn get<'a>(&'a self, k: &K) -> &'a V 

및 상수 (&) 참조를 반환는 HashMap에 [] 촬영

pub struct Edge { 
    to:  char, 
    from: char, 
    weight: int 
} 

pub struct digraph { 
    _vertices: Vec<char>, 
    _adj_list: HashMap<char, Vec<(char,int)> > 
} 

impl digraph { 
    pub fn new(nodes: &Vec<char>, edges: &Vec<Edge>) -> Option<digraph> { 
     let mut tmp_adj_list = HashMap::new(); 
     for node in (*nodes).iter() { 
      tmp_adj_list.insert(*node, Vec::new()); 
     } 
     for edge in (*edges).iter() { 
      let Edge{ to: to, from:from, weight:weight } = *edge; 
      if !(*nodes).contains(&to) | !(*nodes).contains(&from) { 
       return None; 
      } 
      tmp_adj_list[from].push((to,weight)) // *********** error here 
     } 
     Some(digraph { _vertices: (*nodes).clone(), _adj_list: tmp_adj_list }) 
    } 
} 

답변

8

선언은 제 (지금은 사용되지 않음) get(..) 함수 설탕이다. 그러나 push(..) Vec의 방법은 &mut 참조이므로 오류가 발생합니다.

당신이 필요로하는 값은 &mut 값을 반환하는 HashMap의 get_mut(..) 메서드입니다. 또한

, 약간의 포인트 :

    방법을 호출 할 때, 역 참조가 자동으로
  • : (*foo).bar() 정확히 foo.bar()
  • 과 동일 할 수 있습니다 역 참조 자동 루프에서 for &edge in edges.iter() {...}

와 이 모든 것을 포함하면 함수는 다음과 같이됩니다.

impl digraph { 
    pub fn new(nodes: &Vec<char>, edges: &Vec<Edge>) -> Option<digraph> { 
     let mut tmp_adj_list = HashMap::new(); 
     for &node in nodes.iter() { 
      tmp_adj_list.insert(node, Vec::new()); 
     } 
     for &edge in edges.iter() { 
      let Edge{ to: to, from:from, weight:weight } = edge; 
      if !nodes.contains(&to) | !nodes.contains(&from) { 
       return None; 
      } 
      tmp_adj_list.get_mut(&from).push((to,weight)) 
     } 
     Some(digraph { _vertices: nodes.clone(), _adj_list: tmp_adj_list }) 
    } 
} 
관련 문제