C++, vector를 동적할당 하고, 접근하기

minyoung347의 이미지

안녕하세요, C++로 vector를 동적할당하고 거기에 접근하려는 코드를 만들고 있습니다.
문제를 간단하게 하기 위해서 10명의 사람이 1~10번까지 번호를 부여 받고, 각각 점수를 10*(1~10)점 받았다고 하겠습니다.
제 생각에는 아래와 같이 코드를 만들면 ptr가 가리키는 크기가 10인 벡터가 하나 생성되고,
크기가 10인 벡터에 다음과 같은 변수(number, grade)를 차례로 넣는다고 생각했습니다.
하지만 위의 코드를 실행시키면
error: 'class std::vector' has no member named 'number'
error: 'class std::vector' has no member named 'grade'
라는 에러 문구가 나옵니다. 이 문제를 어떻게 해결할 수 있을까요??
답변해 주시면 감사하겠습니다.

class people
{
public:
    int number;
    int grade;
}
-------------------------------------
int num_of_people;
num_of_people=10;
vector<people> *ptr = new vector<people>(num_of_people);
for(vector<people>::size_type i=0; i!=num_of_people; ++i)
{
    *ptr[i].number=i;
    *ptr[i].grade=i*10;
}
BrownBear의 이미지

class People
{
public:
	int number;
	int grade;
};
 
 
int main(int argc, char** argv)
{
	int num_of_people = 10;
	vector<People> *Ptr = new vector<People>(num_of_people);
 
	size_t CurrentCount = 0;
	for (vector<People>::iterator Iterator_Pos = Ptr->begin(); Iterator_Pos != Ptr->end(); ++Iterator_Pos)
	{
		Iterator_Pos->grade = Ptr->size() - Ptr->size() + CurrentCount;
		Iterator_Pos->number = CurrentCount * 10;
		++CurrentCount;
	}
 
	return 0;
}

그 방법은 생각좀해봐야 될것같네요

BrownBear의 이미지

class People
{
public:
	int number;
	int grade;
};
 
int main(int argc, char** argv)
{
	int num_of_people = 10;
	vector<People> *Ptr = new vector<People>(num_of_people);
 
	for (vector<People>::size_type i = 0; i != num_of_people; ++i)
	{
		(*(People*)&Ptr[i]).number = i;
		(*(People*)&Ptr[i]).grade = i * 10;
		printf("Index : %zu\n", i);
		printf("Current number : %d\n", (*(People*)&Ptr[i]).number);
		printf("Current grade : %d\n", (*(People*)&Ptr[i]).grade);
	}
 
	system("pause");
 
	return 0;
}

이 방법으로 하니깐 됩니다.

익명 사용자의 이미지

(*(People*)&Ptr[i]).number = i;

잘못된 메모리 참조입니다.

C++에서 포인터에 대한 형변환을 쓰고 있다면 뭔가 잘못되어가고 있다고 생각하는게 좋습니다.

BrownBear의 이미지

이게 정답인것 같네요.

프로그램 종료하기전에 어째 뻑난다했더니 위의 예제가

너무 깊게 생각하니 저런 오류가 나는듯합니다.

shint의 이미지

//------------------------------------------------------------
//출력은 되는 코드
//------------------------------------------------------------
http://codepad.org/FXwrtUF4

//------------------------------------------------------------
//메모리 오류가 발생한 코드
//------------------------------------------------------------
http://codepad.org/iwWrAoyK

//------------------------------------------------------------
//코드가 한줄 증가할때 마다. 처리 시간이 증가 합니다. ㅇ_ㅇ;;
//------------------------------------------------------------

//------------------------------------------------------------
//처리 속도
//GPGPU AMP > PPL > 배열 > CAtlMap > StlPort > stl list vector > queue deque map
//------------------------------------------------------------

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

익명 사용자의 이미지

(*ptr)[i].number=i;

괄호를 치세요.
연산자의 우선순위가 배열참조 연산자가 더 높습니다.

BrownBear의 이미지

오옹 이 방법도 있었네요

minyoung347의 이미지

익명사용자님 답변 정말 감사합니다. 원래 코드에서도 (*ptr) 방법을 쓰니까 바로 오류가 사라졌습니다.
저렇게 바로 생각하려면 공부를 체계적으로 해야겠네요ㅜ.. 다시 한 번 감사드립니다!!

BrownBear의 이미지

음 제가 한방법이

값은 나오는데 뭔가 제대로 틀린것같은 기분이..

윗 방법과 이 방법을 혼용해버리니깐 값이 짬뽕으로 나오는데 곰곰히 생각해봐야겠어요

BrownBear의 이미지

제 방법이 오류가 있었네요

역시나 오류내놓고 뻑..

포인터 공부를 조금더 하고 와야겠습니다.

minyoung347의 이미지

BrownBear님, 친절하게 답변을 달아주셔서 감사합니다. 일단은 (*ptr)로 하니까 바로 되긴 했습니다.
Bear님이 알려주신 코드들도 보면서 다양하게 접근하는 방법을 알았습니다. 알려주신 코드들도 연구해 보도록 하겠습니다. 감사합니다!!

BrownBear의 이미지

제껀 연구하면 안되는거에요

이상한 포인터 참조해버리는거에요 ㅋㅋ... 클나영

pokev25의 이미지

http://ideone.com/IRfVnj

이렇게 하시면 됩니다.

그리고 벡터에 대해서는 기본 개념을 좀더 공부하세요.

http://www.hanbit.co.kr/network/view.html?bi_id=1606

hsnks100의 이미지

이런 끔찍한 C++ 의 탈을 쓴 C 코드네요.

----------------------------------------------------
개인 블로그: https://kangssu.com

아이온@Naver의 이미지

vector를 dynamic allocation하는 이유는 아마도 vector가 갖고 있는 데이터들을 copy하는 일이 생기지 않도록 하자는 것일 텐데요. 그냥 보통 int variable들 다루듯이 vector를 쓰셔도 c++ 11 이후의 move semantic이나 tail call optimization 같은 컴파일러 최적화로 내부의 데이터들이 일일이 모두 카피되는 일은 잘 생기지 않습니다. 중복 카피가 되는 건 vector 구현에 사용되는 O(1) 규모의 숨겨진 data들뿐이죠.

twinwings의 이미지

코드 동작하지 않는 원인만 보면, 연산자 우선순위 때문에 그렇습니다.

		*ptr[i].number = i;
		*ptr[i].grade = i * 10;

에서

		(*ptr)[i].number = i;
		(*ptr)[i].grade = i * 10;

으로

바꾸면 됩니다. 물론 안좋은 코드입니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.