2011-02-13 3 views
1

유량 (double) 및 시간 (double)을 반환하는 장치에서 데이터를 가져옵니다. 나는 그들을 저장하고 유속을 얻기 위해 시간과 시간을 얻기 위해 유속을 사용하여 데이터에 접근 할 수 있어야합니다 ...stl :지도 및 대칭 데이터 액세스

나는 이것을하기 위해 두 개의 stl : map 컨테이너를 사용하고 있습니다 ... 하나의 컨테이너 만 사용하는 방법이 있습니까? 여기

이 데이터를로드하는 방법이다 : 쉼표로 구분 된 문자열 흐름 데이터 (sData로)을한다 ("11.2, 22.3, 14.3, 12.4, 13.3") 데이터는 각각 0.25 초를 수집 - 그래서 우리는 단지를 증가 시간 ...

void LiquidTest::Load(string sData) 
{ 
    string sFlow; 
    istringstream iss(sData); 

    cout << "Inside LiquidTest::Load()." << endl; 

    double dTime = 0.0; 
    double dFlow = 0.0; 

    while (getline(iss, sFlow, ',')) 
    { 
    // add the flow/time to the map(s) 
    cout << "Adding flow/time to map. sFlow=" << sFlow << ", dTime=" << dTime << "." << endl; 

    // Convert my string to a double 
    std::stringstream s(sFlow); 
    s >> dFlow; 

    // add the flow data and time data to the maps. We will then 
    // be able to access the flow by the time key and the time 
    // by the flow key. Do I need two maps ??? 
    m_mapFlowDataKeyTime.insert(pair<double, double>(dFlow, dTime)); 
    m_mapTimeKeyFlowData.insert(pair<double, double>(dTime, dFlow)); 

    // Increment the time 
    dTime += 0.25; 
    } 
} 

답변

2

당신이 찾고있는 것은 양방향지도이며이를 구현하는 일반적인 방법은 실제로 두 개의 별도지도가 있어야합니다. 또는 Boost.Bimap과 같은 라이브러리 구현을 사용할 수도 있습니다. 당신은 복식 정확하게 비교 기대할 수 없다, 그것은에서 중복을 허용하는 약간의 가능성이 있기 때문에 요소를 검색 할 두 배의지도를 사용

3

문제입니다.

당신이 실제로 어떤 중복이 없을 것 알고 있다면 데이터 및 NaN 값이없는 경우 값을 정렬하고 범위 비교를 수행하려는 경우지도를 사용할 수 있습니다.

당신이 원하는 것은 구조체 또는 쌍의 모음이고, 두 가지 다른 방식으로 정렬하는 몇 가지 방법입니다. Boost에는이를 위해 다중 색인이 있거나 분류 기준을 설정하여 쉽게 색인을 만들 수 있습니다. 하나의 기준에 저장된 데이터를 저장 한 다음 다른 기준에 대한 색인을 갖고 자 할 수 있습니다.

데이터가 정적 인 경우 (즉, 한 번로드 한 다음 검색하는 경우) 유지하기가 쉽습니다. 지속적으로 새 항목을 추가하고 항목을 제거하는 경우보다 정교한 유지 관리가 필요합니다.

목록은 목록의 반복자에 대해 색인을 생성 할 수 있으므로 저장하는 한 가지 방법이며 나중에 다른 요소가 추가 될 때 무효화되지 않습니다. 또한 다른 요소를 무효화하지 않고 원하는 경우 이러한 반복기를 쉽게 제거 할 수 있습니다.

실제 데이터를 사용하면 시간은 0.25 단계에 불과하므로 실제로 흐름을 나타내는 double 벡터를 가질 수 있으며 flow[i]의 시간은 i/4임을 알 수 있습니다. 그러면 처음에는 time[i]이 i이지만 다른 벡터를 기반으로 정렬 할 수있는 int (또는 size_t)의 두 번째 벡터를 가질 수 있습니다. 따라서 time[i]의 흐름은 flow[time[i]]이며이 값을 기준으로 정렬 할 수 있습니다 (펑터가 필요함). 그런 다음 유사한 펑터를 사용하여 이진 검색을 사용하여 흐름이 일정량 인 시간을 계산할 수 있습니다.