2013-08-21 4 views
0

나는 데이터를 수집하여 데이터베이스로 전송하는 양식을 만들었습니다.값이 이미 벡터에 존재하는지 확인하십시오.

데이터베이스에는 테이블이 두 개 있습니다. 하나는 주 테이블이고 두 ​​번째 테이블은 일대 다 관계에 있습니다.

일을 명확하게하기 위해 이름을 지정합니다 : 주 테이블은 Table1이고 하위 테이블은 ElectricEnergy입니다.

ElectricEnergy 테이블 있도록 스키마 다음있다, 월 및 연도를 통해 에너지 소비를 저장 표에서

:

ElectricEnergy < #ElectricEnergy_pk, $ Table1_pk, 1 월, 2 월, ..., 12 년>

양식에서 사용자는 특정 연도의 데이터를 입력 할 수 있습니다. 나는이 울부 짖는 소리를 설명하기 위해 노력할 것입니다 :

년도 : 2012

1 월 3 : 20.5 킬로와트/시간

2월 : 250.32 킬로와트/시간

등등.

채워진 테이블은 다음과 같습니다

YEAR | January | February | ... | December | Table1_pk | ElectricEnergy_pk | 
    2012 | 20.5 | 250.32 | ... | 300.45 |  1 |  1    | 
    2013 | 10.5 | 50.32 | ... | 300 |  1 |  2    | 
    2012 | 50.5 | 150.32 | ... | 400.45 |  2 |  3    | 

소비가 저장 될 수있는 년의 수를 알 수 있기 때문에

, 나는 그들을 저장하는 vector를 사용하기로 결정했습니다.

벡터는 배열을 포함 할 수 없기 때문에 13 (12 개월 + 1 년) 배열이 필요하므로 양식 데이터를 벡터에 저장하기로 결정했습니다.

데이터에 십진수가 있으므로 벡터 유형은 double입니다.

작은 설명 :

vector<double> DataForSingleYear; 
vector< vector<double> > CollectionOfYears. 

I 성공적 벡터 DataForSingleYear로 데이터를 밀어 수 있고, 내가 성공적 벡터 CollectionOfYears에 모든 년을 푸시 할 수 있습니다.

문제는 사용자가 같은 해를 입력란에 여러 번 입력하고 월 단위 소비량을 다르게하여 중복 값을 생성 할 수 있다는 것입니다.

YEAR | January | February | ... | December | Table1_pk | ElectricEnergy_pk | 
    2012 | 20.5 | 250.32 | ... | 300.45 |  1 |  1    | 
    2012 | 2.5 | 50.32 | ... | 300 |  1 |  2(duplicate!) | 
    2013 | 10.5 | 50.32 | ... | 300 |  1 |  3    | 
    2012 | 50.5 | 150.32 | ... | 400.45 |  2 |  4    | 

내 질문은 :

그 값이 벡터에 있는지 확인하는 가장 좋은 방법은 무엇입니까 그것은 다음과 같이 보일 것이다

?

나는 그 질문이 "포괄적"인 것을 알고있다. 그러나 나는 적어도 나를 시작하기위한 아이디어를 사용할 수있다.

참고 : 년도 반복자의 위치가 12 데이터베이스에 삽입 될 데이터의 순서를, 그래서, 벡터의 끝에 중요하지 않다, 어떠한 정렬 요구 사항이 없습니다.SO 아카이브를 통해 검색하여

, 나는 std::set의 사용에 대한 제안을 찾았지만, 그 문서 요소 를 삽입 할 때 수정, 그리고 나를 위해 받아 들일 수없는 옵션이 될 수 없음을 말한다.

반면에 std::find은 흥미로운 것 같습니다.

(이 부분은 내가 질문 편집을 할 때 제거되었다

,하지만 마지막 요소를 처리하지 않고, 올해는 벡터의 끝에 즉, 변경할 수 있으며, 내가 기꺼이. 그 작은 조정은 std::find

). 내 마음이 벡터를 통해 루프했다 교차하는 유일한 것은

을 도와, 값이 이미 존재하는 경우 볼 수 있지만, 나는 그것이라고 생각하지 않습니다 수없는 경우 최상의 솔루션 :

wchar_t temp[50]; 
    GetDlgItemText(hwnd, IDC_EDIT1, temp, 50); // get the year 
    double year = _wtof(temp); // convert it to double, 
            // so I can push it to the end of the vector 

    bool exists = false; // indicates if the year is already in the vector 

    for(vector< vector <double> >::size_type i = 0; 
     i < CollectionOfYears.size(); i++) 

     if(CollectionOfYears[ i ] [ (vector<double>::size_type) 12 ] == year) 
     { 
     exists = true; 
     break; 
     } 

    if(!exists) 
    // store main vector in the database 
    else 
    MessageBox(... , L”Error”, ...); 

나는 Windows XP, MS Visual Studio에서 C++ 및 순수한 Win32를 사용하여 작업합니다.

추가 코드가 필요한 경우 요청하십시오.

감사합니다. find_if 람다 필터를 사용

+4

'std :: find'가 마지막 요소를 처리하지 않는다는 것은 무엇을 의미합니까? 그리고'std :: set'의 멤버를 수정할 수는 없지만 새로운 멤버를'지우고'삽입 할 수 있습니다. –

+0

아래 답변에서 std :: find에 대한 내 메모가 왜 틀린 지 설명합니다. Mr.Potter에게 감사드립니다. – AlwaysLearningNewStuff

+0

@Jonathan Potther, 나는 두 배의 비교에 관한 Mr.Potter의 질문이 있습니다. 저는 온라인 어딘가를 읽었습니다. 두 배를 비교하면 (5,5와 5,5) 기본 정밀도 때문에 오류가 발생할 수 있습니다. 내 질문에, 올해는 두 배이지만, 소수는 없기 때문에, 년은 정수이기 때문에. 연도가 double 형식이므로 정밀도 문제가 발생할 가능성이 있습니까? 고맙습니다. 문안 인사. – AlwaysLearningNewStuff

답변

2

는 :

auto match = std::find_if(CollectionOfYears.begin(), CollectionOfYears.end(), 
          [&year](v){ return year == v.last(); }) 
if (match == CollectionOfYears.end()){ //no value previously 

} 

이 여전히 전체 배열을 반복 할. 보다 효율적인 검색이 필요한 경우 배열을 정렬 된 상태로 유지하고 이진 검색 또는 std :: set을 사용해야합니다.

vector :: end()는 마지막 요소 다음의 요소에 반복자를 반환한다는 것에주의하십시오. 이것이 std :: find가 마지막 값을 무시하는 이유입니다 (이미 범위를 벗어 났기 때문에!).

+0

std :: find에 대한 귀하의 답은 제 실수를 이해하는 데 도움이되었습니다. 귀하의 솔루션에 관해서는, 전에 람다 필터와 find_if를 사용한 적이 없으므로, 귀하의 코드를 이해하는 데 어려움이 있습니다. 결과를보고하기 전에 연구해야 할 것입니다. 답변 주셔서 감사합니다. – AlwaysLearningNewStuff

+0

두 배의 비교에 관한 Mr.Keskinen의 질문이 있습니다. 저는 온라인 어딘가에서 두 배 (5,5,5,5)를 비교하면 기본 정밀도 때문에 오류가 발생할 수 있다고 읽었습니다. 내 질문에, 올해는 두 배이지만, 소수는 없기 때문에, 년은 정수이기 때문에. 연도가 double 형식이므로 정밀도 문제가 발생할 가능성이 있습니까? 고맙습니다. 문안 인사. – AlwaysLearningNewStuff

관련 문제