2017-04-27 1 views
0

저는 C++ 11과 STL 라이브러리에 대해 아주 많이 배우고 있습니다. 난 내가 마지막 warr_temp = warr;을 복사하는 3 벡터와 1 개 벡터를 복용하고이 코드에서 무엇을하고 무엇을 같이하는 코드,std :: distance()는 어떻게 작동합니까?

#include <bits/stdc++.h> 
#include <vector> 
#include <algorithm> 
#include <iterator> 
using namespace std; 

void Print(const vector<int> &arrays) 
{ 
    for (int x : arrays) cout << x << ' '; 
} 

int main() { 
    int citys, cityPairs, fv, lv, w; 
    vector <int> fvarr; 
    vector <int> lvarr; 
    vector <int> warr; 
    vector <int> warr_temp; 
    vector <int> disjoint_pairs; 

    scanf("%d%d", &citys, &cityPairs); 

    for(int nr = 0; nr < cityPairs; nr++){ 
     scanf("%d%d%d", &fv, &lv, &w); 
     fvarr.push_back(fv); 
     lvarr.push_back(lv); 
     warr.push_back(w); 
     warr_temp = warr; 
    } 

    for (int j = 0; j < citys; j++){ 
    auto result = min_element(begin(warr_temp), end(warr_temp)); 
    auto pos_temp = distance(begin(warr_temp), result); 
    cout << pos_temp; 
    auto pos = distance(begin(warr), result); 
    cout << pos; 
    disjoint_pairs.push_back(fvarr[pos]); 
    disjoint_pairs.push_back(lvarr[pos]); 
    warr_temp.erase(warr_temp.begin() + pos_temp); 
    } 
    // Print(disjoint_pairs); 
} 

입니다 작성했습니다. 그런 다음 벡터 warr_temp의 최소값을 확인하고 그 인덱스를 pos_temp에 저장하고 난 다음 벡터의 최소값 인덱스를 warr에서 pos으로 저장합니다.

이제 문제는

-61-62-63-64 

왜 이런 일이, pos_temp 나에게 올바른 값 만 pos 나에게 이런 식으로 출력 무언가를주고 두 번째를주고 첫 cout입니까? 이 숫자들은 뭐야? 그들은 포인터입니까? 나는 거리가 하나의 템플릿이라는 것을 알고 있으므로 이것을 구현하는 올바른 방법은 무엇입니까?

누군가가 내 도움을 청할 수 있다면 매우 도움이 될 것입니다. 미안하다면 바보 같은 질문 !!!

답변

1

문제의 근본 원인은 auto pos = distance(begin(warr), result);입니다. resultbegin(warr)은 다른 벡터에 속하기 때문에 예기치 않은 결과가 나타납니다.

resultwarr_temp 요소를 가리키는 반복자이므로 begin(warr)과 같은 요소를 가리키는 반복자와 혼합 할 수 없습니다.

대신 warr 벡터를 사용 std::find(begin(warr), end(warr), *result)에서 요소의 위치를 ​​효율적으로 활용하려면 다음

+0

하이 로스트, 나는 그것의 " '이런 식으로 나에게 연산자 <<' ''에 대한 일치를 '오류가 제공되지 않는 방법을 사용했다

auto warr_res = std::find(begin(warr), end(warr), *result); auto pos = distance(begin(warr), warr_res); 
이 줄 "cout << pos;" . 그러나 만약 내가 "이 같은 책자 << * pos"다음 인덱스를 인덱스가 아니라 인덱스에있는 번호를 제공하고 있습니다. – Proloy

+0

@Proloy 업데이트 된 답변보기. 'std :: find'는 iterator를 제공합니다. 인덱스를 얻기 위해'std :: distance'를 적용해야합니다. – Rost

+0

고쳐 주셔서 고맙습니다 !! – Proloy

관련 문제