2011-11-16 3 views
9

vector<double>massvelocity 모두 같은 크기 N이 있습니다. 그것들은 N 개의 입자의 질량과 속도에 대한 정보를 담고있다. mass[i]velocity[i]은 i 번째 입자의 특성입니다."고정"두 벡터를 정렬하고 그들을

C++에서이 두 벡터를 함께 "잠궈"질량이 큰 순서로 정렬 할 수 있습니까? mass는 증가 순서이어야 벡터를 정렬하고, 속도 벡터가 정렬 된 질량의 대응하는 속도를 포함한다 따라서 후

예컨대 정렬하기 전에 질량 = (4,2,1,3) 및 속도 = (13,14,15,16) 질량 = (1,2,3,4) 및 속도 = (15, 14, 16, 13)

내가이 아는 한 (비 효율성) 방법은 <를 오버로드하여 std::sort 사용하여이 벡터를 구조체의

struct particle 
{ 

double mass; 
double velocity; 


bool operator < (const particle& str) const 

{ 
    return (mass < str.mass); 
    } 



}; 

의 벡터로 데이터를 전송하고 vector<particle> particlelist(N)를 만든 다음 정렬

입니다 위에서 정의한대로 연산자를 사용합니다.

필자는 구조 데이터 배열을 구조체 방식에 비해 비효율적이라고 들었으므로 데이터를 구조체 형식으로 저장하고 싶지 않습니다 (적어도 CUDA에서).

+0

로 이어질 수 있기 때문에 더 나은 당신이 하나의 속성을 다른 변경 전 같은 방식을 변경하는 경우와 같은 뜻 "잠금"? –

+0

나는 편집을하고 질문을 명확히했다. – smilingbuddha

+0

관련 항목 : http://stackoverflow.com/questions/3398819/sort-by-proxy-or-sort-one-container-by-the-contents-of-another-in-c –

답변

5

적어도 내가 아는 한, 표준 라이브러리에 직접 입력하면됩니다. 가장 확실한 가능성은 Boost Zip Iterator을 사용하여 두 배열이 단일 컬렉션처럼 동작하도록하는 것입니다. 당신이 연결되어있는 두 개의 값을 가지고

+2

[zip_iterator가 std :: sort에서 작동하지 않습니다.] (http://stackoverflow.com/a/9343991). – jhoffman0x

10

벡터 인덱스 생성; 당신이 두 배열에있는 항목의 벡터 인덱스 순서가보다 0..N-1

struct CmpMass { 
    { 
     CmpMass(vector<double>& vec) : values(vec){} 
     bool operator() (const int& a, const int& b) const 
     { 
      return values[a] < values[b]; 
     } 
     vector<double>& values; 
    } 

sort(indexes.begin(), indexes.end(), CmpMass(mass)); 

이상의 값으로 채 웁니다. 당신은 정확한 순서로 질량/속도 벡터를 만들거나 접근하는 동안 인덱스를 변환 할 수 있습니다 : 질량 [indexes [i]], 속도 [indexes [i]]

5

왜 지원 std::sort의 오버로드 된 버전이 존재한다 (포인터를 통해 std::sort 기능에 통과 한 후 자신의 비교 방법/기능을 구현할 수있는 것보다 당신을 std::pair를 사용하지 않는 그).

그러나 당신이 strict weak ordering 구현했는지 확인, 다른 std::sort가 정의한 SEGFAULT

관련 문제