2017-12-10 2 views
5

나는 양의 정수와 -1을 포함하는 벡터를 가지고있다. 내 문제는 벡터를 정렬하고 싶지만 단지 std::sort을 사용하여 -1 elements을 터치하지 않아야한다. (나는 다른 접근법을 알고있다.)표준 정렬하는 방법 :: vector std :: sort 사용하여 특정 요소를 변경하지 마십시오?

입력 : [-1, 150, 190, 170, -1, -1, 160, 180]

출력 : [-1, 150, 160, 170 예컨대

, -1, -1, 180, 190]

이 내 생각이 그것을 해결하는 것입니다하지만 작업 일부러 :

sort(myVector.begin(), myVector.end(), [&](const int& a,const int& b)->bool { 
     if (a == -1 || b == -1) 
      return &a < &b; 
     return a < b; 
    }); 
,536,913,632을 10,

출력 : [-1, 150, 170, 190, -1, -1, 160, 180]

출력은 다음과 같아야합니다. [-1, 150, 160, 170, -1, -1 , 180, 190]

std::sort을 사용하여 해결할 생각이 있습니까?

+5

내가 그것을 직접 가능하다고 생각하지 않습니다 대안, -1의의 위치를 ​​추출 모든 -1의 삭제, 벡터를 정렬하고 적절한 다시 삽입하는 것입니다. 'std :: sort' 함수는 범위에서 작동하고 요소를 일시적으로 제거하고 나중에 같은 위치에 다시 추가하는 방법이 없습니다 (물론 여러 단계에서이 작업을 수행 할 수 있지만 그 작업은 당신은 묻고 있습니다). 또한 "std :: sort"를 "사용자 정의"하는 것이 의미하는 바를 얻지 못합니다. 또한'std :: sort'가 어떻게 동작하는지 AFAIK가 구현을 정의하므로 순서가 어떻게되는지에 대해 어떤 가정도 할 수 없습니다. – Yashas

+0

@ Yashas 내 영어로 죄송합니다. 내 질문을 편집했습니다. –

+2

'-1'의 위치를 ​​벡터에 추출하고, 모든'-1's을 지우고, 정렬하고 다시 파이프합니다. – Ron

답변

3

std::sort 할 수 없습니다. 엄격하고 약한 순서에 따라 요소 범위를 정렬합니다. 정의한 순서는 strict-weak이 아닙니다. 엄격한 약점이있는 주문을 정의 할 방법이 없기 때문에 특정 값이 현재 위치에 남아있게됩니다. 따라서 이러한 순서로 sort을 사용하려고하면 정의되지 않은 동작이 발생합니다.

그래서 자신의 정렬 기능을 작성해야합니다. 또는 -1을 제거하고 (위치 기록) 목록을 정렬 한 다음 다시 삽입 할 수 있습니다.

0

std::sort을 단독으로 사용할 수 없습니다.

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

int main() { 
    std::vector<int> v{ -1, 150, 190, 170, -1, -1, 160, 180 }; 
    std::vector<int> vtemp; 
    auto it = v.begin(); 
    while ((it = std::find_if(it, v.end(), [](int x){ return x == -1; })) != v.end()) { 
     vtemp.push_back(std::distance(v.begin(), it)); 
     it++; 
    } 
    v.erase(std::remove(v.begin(), v.end(), -1), v.end()); 
    std::sort(v.begin(), v.end()); 
    for (auto el : vtemp){ 
     v.insert(v.begin() + el, -1); 
    } 
} 
+0

속도를 향상시키기위한 명백한 최적화가 있습니다 (특히 -1을 다시 삽입하는 경우). 그러나 이것은 합리적인 방법입니다. 당신은 벡터 자체에 -1의 위치를 ​​저장함으로써 공간을 추가하지 않고도 할 수 있습니다. – davidbak

관련 문제