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

purenous의 이미지

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

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의 이미지

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

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

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

purenous의 이미지

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

#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;
}
danskesb의 이미지

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

purenous의 이미지

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

cronex의 이미지

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

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

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

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

purenous의 이미지

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

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

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

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

cronex의 이미지

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

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

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

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

ssehoony의 이미지

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

그래서

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

는 안전한 코드입니다.
purenous의 이미지

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

cronex의 이미지

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

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

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

purenous의 이미지

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

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

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

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

cronex의 이미지

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

#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;
}

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

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

purenous의 이미지

헛! 감사합니다!!!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.