2014-07-05 2 views
0

구조체를 만들었고 구조체에 메트릭이 있습니다. 나는이 구조체의 시리즈를 생성하고 있는데이 메트릭을 기반으로 배열로 정렬하려고합니다. 기본적으로 메트릭이 0 인 경우 배열의 [0] 슬롯에있는 목록에서 원하는데, 메트릭이 14 일 경우 배열의 [14] 슬롯에있는 목록에서 원하는 것입니다. 메트릭의 경계 (배열의 크기)는 구조체가 생성 된 동일한 변수를 기반으로 가변적이어서 malloc을 사용하여 배열을 동적으로 선언해야합니다. 나는이 구조체 배열 목록을 얻는 방법을 실험 해왔다. 나는 그것을 이해할 수 없다. 내가 문제를 봤어 그리고 해결책을 생각해 낼 수 없었습니다.선언, 변경 및 C++의 구조체 목록 배열에 추가

배열을 가져 오면 특정 배열 셀 목록에 다른 요소를 어떻게 추가합니까? 그런 다음 i 번째 셀의 목록의 모든 요소를 ​​(n-i) 번째 셀의 요소와 비교합니다.

편집 : 모든 측정 항목에 요소가있는 것은 아닙니다.

편집 2 : 시도한 결과 몇 가지 문제가있는 것으로 보입니다.

list<s_pair> *pairs; 
pairs = (list<s_pair>*) malloc(sizeof(list<s_pair>) * (N + 1)); 

j = { a, b }; 
pairs[m].push_back(j); 

여기서 m은 s_pair 유형의 메트릭입니다. 컴파일하는 것이지만 push_back (j)을 시도하는 데 막혔습니다.

+0

각 메트릭에는 구조체가 하나만 있으며 분포가 밀집되어 있습니다 (구멍이 거의 없거나 전혀없는 경우)? '선언하는 '은 당신이 사용하는 의미가 아니라'정의하는'또는'할당하는 '것을 원한다는 것을 명심하십시오. 이것은 C와 C++에서 특히 중요합니다. C와 C++은 모두 구별되고 잘 정의 된 개념입니다. (정의하는 것은'선언하는 것 '을 의미하지만 그 반대는 아닙니다.) – Deduplicator

+0

아니요. 각 측정 항목에는 구조체가 없거나 구조체가 포함될 가능성이 있습니다. 메트릭 중 1/4은 구조체가 없지만 나머지는 적어도 하나는 있어야한다고 말해야합니다. 또한주의해야합니다. 그 정의는 무엇을 선언합니까? – BeaumontTaz

+3

열린 체인이있는 해시 테이블을 설명하는 것처럼 보입니다. (메트릭은 해시 함수입니다.) – Deduplicator

답변

0

C++에서 당신이 할 수 있습니다 :

#include <vector> 
#include <list> 

size_t metric(s_pair const &); 

class MyTable 
{ 
    std::vector< std::list<s_pair> > table; 

public: 
    void insert(s_pair s) 
    { 
     size_t index = metric(s); 
     if (index + 1 > table.size()) 
       table.resize(index + 1); 
     table[index].push_back(s); 
    } 
}; 

을 (분명 당신이 그렇게에 테이블에 액세스하기위한 다른 기능이있을 것이다).

metric이 엄청나게 많으면 (20 억 개)이 설정에서는 제대로 작동하지 않습니다. 이 경우 벡터 대신 스파 스 배열이 필요합니다 (C++에는 표준 희소 배열이 없지만 찾을 수 있거나 만들 수 있습니다).

샘플 사용 :이 예에서

int main() 
{ 
    MyTable items; 
    items.insert(whatever); 
} 

이없는 항목을 가지고있는 메트릭은 빈 목록으로 표시됩니다.

+0

C++을 많이 사용하지 않았다면,'s_pair'가 적절한 값의 의미를 지니고 있는지 확인해야합니다 (복사 또는 이동하는 경우 유효한 객체로 유지됩니다). 이를 수행하는 가장 쉬운 방법은 적절한 값 의미를 자체적으로 갖는 멤버 변수 만 갖도록 만드는 것입니다. –