나는 데이터를 수집하여 데이터베이스로 전송하는 양식을 만들었습니다.값이 이미 벡터에 존재하는지 확인하십시오.
데이터베이스에는 테이블이 두 개 있습니다. 하나는 주 테이블이고 두 번째 테이블은 일대 다 관계에 있습니다.
일을 명확하게하기 위해 이름을 지정합니다 : 주 테이블은 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 람다 필터를 사용
'std :: find'가 마지막 요소를 처리하지 않는다는 것은 무엇을 의미합니까? 그리고'std :: set'의 멤버를 수정할 수는 없지만 새로운 멤버를'지우고'삽입 할 수 있습니다. –
아래 답변에서 std :: find에 대한 내 메모가 왜 틀린 지 설명합니다. Mr.Potter에게 감사드립니다. – AlwaysLearningNewStuff
@Jonathan Potther, 나는 두 배의 비교에 관한 Mr.Potter의 질문이 있습니다. 저는 온라인 어딘가를 읽었습니다. 두 배를 비교하면 (5,5와 5,5) 기본 정밀도 때문에 오류가 발생할 수 있습니다. 내 질문에, 올해는 두 배이지만, 소수는 없기 때문에, 년은 정수이기 때문에. 연도가 double 형식이므로 정밀도 문제가 발생할 가능성이 있습니까? 고맙습니다. 문안 인사. – AlwaysLearningNewStuff