[완료]c++ STL에 관한 질문입니다.

0
points

일단 제가 저장하고 싶은 데이터는 이런 형태입니다.

1,2,12,20,4,5
22
43,6,7,9
34,3,5
.
.
.
3,8,16,42

각 라인의 엘리먼트 수와, 라인 수는 정해진 크기가 없습니다.
대략 라인당 엘리먼트 수는 100개 이하, 라인수는 10만줄이 될지 100만줄이 될지도 모르는 상황이구요;;

아무튼 이런 데이터가 담겨있는 텍스트 파일에서 데이터를 효과적으로 저장하기 위해
STL을 이용해 구조체 vector나 구조체 list를 써보려고 하는데요.
(삽입/삭제 동작보단 서칭이 많긴 한데...
인덱스가 없으면 또 조작하기가 힘들 것 같아서 되도록이면 vector를 사용하고 싶습니다.)

구조체 멤버들에 접근하는 방법을 도무지 모르겠습니다.
도트로 접근할 수 있으면 편할텐데..ㅜ.ㅜ

struct data {
vector(string) item; 꺽쇠가 안먹는군요;;
//혹은
//string item[100];
};

대략 구조체 멤버는 이렇게..하고

vector(data) v;

구조체 vector로부터 멤버에 접근하기 위해서 어떤 방법을 쓰면 좋은지 좀 알려주세요ㅠ.ㅠ

cronex의 이미지
4891
points

iterator나 front() back()

0
points

iterator나
front()
back() 을 이용해보세요....

------------------------------------------------------------
이 멍청이~! 나한테 이길 수 있다고 생각했었냐~?
광란의 귀공자 데코스 와이즈멜 님이라구~!

iter->item[i] 이런 식으로 말입니까?

-1
points

한번 해봐야겠네요..될려나;;

#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>

using namespace std;

struct tdata
{
vector<string> item;
};


int _tmain(int argc, _TCHAR* argv[])
{
vector<tdata> t;

vector<tdata>::iterator titer;

titer = t.begin(); // 디버깅 해보니깐 이부분에서 에러입니다.

titer->item.push_back("test");

cout << titer->item[0];

return 0;
}

peremen의 이미지
7349
points

벡터의 begin()은

0
points

벡터의 begin()은 원소가 없는 경우에는 잘못된 이터레이터를 돌려줍니다.
---- 절취선 ----
http://blog.peremen.name

접근을 해야 원소를 미리 할당해놓든지 말든지 할텐데;;

0
points

이거 원 어떻게 해결해야할지 막막하네요;;

cronex의 이미지
4891
points

집어넣는건 pushback()

0
points

집어넣는건 pushback() 을 이용합니다.
vector의 member 함수들의 목록을 일단 먼저 살펴보심이 어떠실런지요;;;

http://www.cplusplus.com/reference/stl/vector/

------------------------------------------------------------
이 멍청이~! 나한테 이길 수 있다고 생각했었냐~?
광란의 귀공자 데코스 와이즈멜 님이라구~!

예 그 집어넣기

0
points

예 그 집어넣기 전에
'어디'에 집어넣어(push_back())라고 명령을 해야하는데
그 '어디'를 지정하는 방법을 모르겠어요ㅠ.ㅠ

구조체 vector가 아니라면 iterator 쓸 필요도 없이
선언해놓고 v.push_back()하면 간단하게 들어가지지만;;

vector v의 구조체 멤버인 item에 집어넣는 방법을;;

응용력이 부족한가봐요 아무래도;;

cronex의 이미지
4891
points

해당 구조체를 하나

0
points

해당 구조체를 하나 선언하십시오.
그리고 그 구조체에 값을 설정하고 vector에 밀어 넣으시면(?) 됩니다.
stl vector는 삽입시에 객체를 자동으로 복사해서 넣으니 굳이 new로 객체를 새로 생성할 필요도 없습니다.

나중에 값을 변경하고자 할땐 iterator 나 front,back,at과 같은 함수로
특정 위치의 구조체를 가져다가 값을 변경하시면 되겠습니다.

------------------------------------------------------------
이 멍청이~! 나한테 이길 수 있다고 생각했었냐~?
광란의 귀공자 데코스 와이즈멜 님이라구~!

ssehoony의 이미지
3699
points

vector 의 begin 은

0
points

vector 의 begin 은 데이터가 없을 경우 end 를 리턴합니다.

그래서

for(iter = vector.begin(); iter != vector.end(); iter++)
{
}

는 안전한 코드입니다.

윗분이 말씀하신 건

0
points

윗분이 말씀하신 건 일단 유효한 메모리 공간을 얻은 후에
iterator가 사용가능하다는 말씀같아요..
(뭔가 실제로 값이 하나 들어가서..)
그리고나서는 값을 지워서 빈 벡터가 되더라도
접근은 할 수 있을 듯

cronex의 이미지
4891
points

그리고 저라면 그냥

0
points

그리고 저라면 그냥 vector에 한줄씩 넣고
한줄씩 꺼내서 tokenize 해서 쓰는게 나을거 같습니다.
(안그래도 그와 비슷하게 만들었던 적도 있기도 하고....)

------------------------------------------------------------
이 멍청이~! 나한테 이길 수 있다고 생각했었냐~?
광란의 귀공자 데코스 와이즈멜 님이라구~!

실은 데이터에서

0
points

실은 데이터에서 assosiation rule 추출하는 과제인데요^^;
엄청난 서칭과 비교연산을 하느라 안그래도 n3 이상 나오는 알고리즘인데..
서칭할 때마다 매번 토크나이징을 하면..대략 난감한 상황이;;

일단 메모리에 잘 정리된 데이터가 다 올라와있는 상태에서 하고 싶습니다;;

마지막에 가르쳐주신 방법으로 하면 어떻게 잘 될 것도 같아요. ㅋ

근데 지금 막 짜보니깐 어디가 잘못된건지 에러나네요;;

cronex의 이미지
4891
points

저로서는 이정도의

0
points

저로서는 이정도의 예제를 올려드리는 방법밖에 없을 거 같습니다.

#include <vector>
#include <string>
#include <iostream>

using namespace std;

struct tdata {
vector<string> items;
};

int _tmain(int argc, _TCHAR* argv[])
{
vector<struct tdata> t;
vector<struct tdata>::iterator tIter;


struct tdata data;


for (int i =0 ; i < 10 ; ++i ) {
for (int j =0 ; j < i ; ++j ) {
data.items.push_back(",");
}
t.push_back(data);
}

for (tIter = t.begin(); tIter != t.end(); ++tIter ) {
vector<string> items= (*tIter).items;
vector<string>::iterator itemIter;
for (itemIter = items.begin() ;itemIter != items.end(); ++itemIter ){
cout<<*itemIter;
}
cout<<endl;

}

t[5].items[4] = "11111111111";

for (tIter = t.begin(); tIter != t.end(); ++tIter ) {
vector<string> items= (*tIter).items;
vector<string>::iterator itemIter;
for (itemIter = items.begin() ;itemIter != items.end(); ++itemIter ){
cout<<*itemIter;
}
cout<<endl;

}
return 0;
}

------------------------------------------------------------
이 멍청이~! 나한테 이길 수 있다고 생각했었냐~?
광란의 귀공자 데코스 와이즈멜 님이라구~!

헛! 감사합니다!!!

0
points

헛! 감사합니다!!!

댓글 보기 옵션

원하시는 댓글 전시 방법을 선택한 다음 "설정 저장"을 누르셔서 적용하십시오.