2017-10-12 2 views
0

임의의 점 집합 그래프에서 가장 왼쪽 점을 찾으려고합니다. 예를 들어, 점 (3, 5) (5, 2) (8, 7) (1, 3) 중에서 가장 왼쪽 점은 1, 3이됩니다. 이 작업을 수행하면 벡터의 자리 0에 가장 왼쪽 지점을 놓아야합니다. mostLeft가 원래있는 지점을 모르기 때문에 두 변수를 전환하는 데 문제가 있습니다. mostLeft는 2 개의 int를 포함하는 노드입니다.벡터에서 두 값 교환하기

나는 mostLeft 두 번

swap(list[0], mostLeft) 

하지만 단지 사본을 사용하여 시도했다.

는 또한
Point temp = list[0]; 
    list.erase(remove(list.begin(), list.end(). mostLeft), list.end()); 
    list[0] = left; 
    list.push_back(temp); 

을 시도했지만이 나에게 "제거 인수에 const를 숯불 *에 벡터를 변환 할 수 없습니다"라는 오류를 제공합니다. 나는 온라인에서 두 번째 코드 블록을 얻었다. 나는 그것이 어떻게 작동하는지 확신 할 수 없다. 그러나 나는 그것을 시험해 보았던 것을 계속 보았다.

이 값을 쉽게 바꿀 수있는 방법이 있습니까? 아니면 수동으로 벡터를 반복하고 값을 찾아야합니까?

+2

, 그 코드도 컴파일입니다 , bein()'또는'list.end(). mostleft'는 당신이 사용하고 있거나 사용하려고 시도하고있는 어떤 것으로부터 가져 오지 않을 것입니다. –

+0

@mhemmy 스왑 (list [0], mostLeft)에서 mostLeft를 사용하는 방법이 명확하지 않습니다. –

+0

'mostLeft'는 참조가 아닌 것 같습니다. – MSalters

답변

0

내가 제대로 이해 한 경우 다음 달성하기 위해 무엇을하려고하는 다음과 같은 방법을 사용할 수 있습니다

#include <iostream> 
#include <utility> 
#include <vector> 
#include <algorithm> 

int main() 
{ 
    std::vector<std::pair<int, int>> v = 
    { 
     { 3, 5 }, { 5, 2 }, { 8, 7 }, { 1, 3 } 
    }; 

    for (const auto &p : v) 
    { 
     std::cout << "(" << p.first << ", " << p.second << ") "; 
    } 
    std::cout << std::endl; 

    auto mostLeft = [](const auto &a, const auto &b) { return a.first < b.first; }; 

    std::swap(v[0], *std::min_element(v.begin(), v.end(), mostLeft)); 

    for (const auto &p : v) 
    { 
     std::cout << "(" << p.first << ", " << p.second << ") "; 
    } 
    std::cout << std::endl; 
} 

프로그램 출력은 유효한 최소한의 예를 제공하십시오

(3, 5) (5, 2) (8, 7) (1, 3) 
(1, 3) (5, 2) (8, 7) (3, 5)