Toggle menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

STL/vector: Difference between revisions

From ZeroWiki
imported>Unknown
No edit summary
 
(Repair batch-0003 pages from live compare)
Line 11: Line 11:
  vector<int>::const_iterator i;  // 벡터의 내용을 변경하지 않을 것임을 보장하는 반복자.
  vector<int>::const_iterator i;  // 벡터의 내용을 변경하지 않을 것임을 보장하는 반복자.
* 초기화시 데이터 넣기
* 초기화시 데이터 넣기
  int data[3] = {1,2,3};
  int data[3] = {1,2,3};
  vector<int> ar(&data[0], &data[3]);    // data내의 정보가 세팅된다.
  vector<int> ar(&data[0], &data[3]);    // data내의 정보가 세팅된다.
  질문 : 상식에 의거해서 실습 해볼 때 저 부분을  
  질문 : 상식에 의거해서 실습 해볼 때 저 부분을  
~cpp  vector<int> ar( &data[0], &data[2] );
<code>vector&lt;int&gt; ar( &amp;data&#91;0&#93;, &amp;data&#91;2&#93; );</code>
로 했더니 계속 문제가 생겨서.. 오랜 삽질끝에  &data&#91;3&#93; 으로 해야한다는 걸 발견 했습니다. 좀 이상한 것 같네요. {{{~cpp data&#91;3&#93;}}} 이라는 것은 배열의 범위를 벗어나는 연산일텐데요.. 그곳의 리퍼런스를 얻어서 생성자로 넘겨주는게.. 상식에서 거부했나 봅니다. 두번째 인자로 배열 범위를 벗어나는 값을 받는 이유를 혹시 아시는 분 계십니까? --zennith
로 했더니 계속 문제가 생겨서.. 오랜 삽질끝에  &data&#91;3&#93; 으로 해야한다는 걸 발견 했습니다. 좀 이상한 것 같네요. <code>data&#91;3&#93;</code> 이라는 것은 배열의 범위를 벗어나는 연산일텐데요.. 그곳의 리퍼런스를 얻어서 생성자로 넘겨주는게.. 상식에서 거부했나 봅니다. 두번째 인자로 배열 범위를 벗어나는 값을 받는 이유를 혹시 아시는 분 계십니까? --zennith
   Iterator 들이나, 배열의 영역설정은 그 모호성을 배제하기 위해서, 마지막 자료형 + 1의  index 를 가지는 것을 상식으로 취급합니다. MFC, Java 등 여타 라이브러리들의 index접근 하는법 마찬가지 입니다. 익숙해 지는 수 밖에 없지 않을까요? --NeoCoin
   Iterator 들이나, 배열의 영역설정은 그 모호성을 배제하기 위해서, 마지막 자료형 + 1의  index 를 가지는 것을 상식으로 취급합니다. MFC, Java 등 여타 라이브러리들의 index접근 하는법 마찬가지 입니다. 익숙해 지는 수 밖에 없지 않을까요? --NeoCoin
  === 데이터 넣기 ===
  === 데이터 넣기 ===
  ar.push_back(3);    // ar의 뒤쪽으로 3을 추가한다.
  ar.push_back(3);    // ar의 뒤쪽으로 3을 추가한다.
  ar[5] = 4          // 6번째에 4 넣기
  ar&#91;5&#93; = 4          // 6번째에 4 넣기


  === 컨테이너 순회 ===
  === 컨테이너 순회 ===
Line 37: Line 37:
  // for문에서 인덱스를 이용한 순회
  // for문에서 인덱스를 이용한 순회
  for(int j = 0 ; j &lt; ar.size() ; ++j)
  for(int j = 0 ; j &lt; ar.size() ; ++j)
     cout &lt;&lt; ar[j] &lt;&lt; endl;
     cout &lt;&lt; ar&#91;j&#93; &lt;&lt; endl;


  === 데이터 제거 ===
  === 데이터 제거 ===
Line 60: Line 60:
  int main()
  int main()
  {
  {
  int ar[] = {32,54,654,765,34,4645625};
  int ar&#91;&#93; = {32,54,654,765,34,4645625};
  vecCont nums(&amp;ar[0], &amp;ar[6]);
  vecCont nums(&amp;ar&#91;0&#93;, &amp;ar&#91;6&#93;);
   
   
  for(vecIter i = nums.begin() ; i != nums.end() ; ++i)
  for(vecIter i = nums.begin() ; i != nums.end() ; ++i)
Line 67: Line 67:
 
 
  for(int j = 0 ; j &lt; nums.size() ; ++j)
  for(int j = 0 ; j &lt; nums.size() ; ++j)
  cout &lt;&lt; nums[j] &lt;&lt; endl;
  cout &lt;&lt; nums&#91;j&#93; &lt;&lt; endl;
 
 
  return 0;
  return 0;
Line 80: Line 80:
----
----
[[STL]]
[[STL]]

Revision as of 00:29, 27 March 2026

vector

  • 배열을 대체할수 있는 자료구조.
  • include : vector
#include <vector>
=== 선언과 크기 잡기 ===
*일반적인 선언
vector<int> ar;                  // int형 데이터를 넣을 vector 컨테이너 ar을 생성.
ar.resize(10);                   // 10개로 잡는다.
vector<int>::iterator iter;      // 내부의 데이터들을 순회하기 위해 필요한 반복자.
vector<int>::const_iterator i;   // 벡터의 내용을 변경하지 않을 것임을 보장하는 반복자.
  • 초기화시 데이터 넣기
int data[3] = {1,2,3};
vector<int> ar(&data[0], &data[3]);    // data내의 정보가 세팅된다.
질문 : 상식에 의거해서 실습 해볼 때 저 부분을 

vector<int> ar( &data[0], &data[2] ); 로 했더니 계속 문제가 생겨서.. 오랜 삽질끝에 &data[3] 으로 해야한다는 걸 발견 했습니다. 좀 이상한 것 같네요. data[3] 이라는 것은 배열의 범위를 벗어나는 연산일텐데요.. 그곳의 리퍼런스를 얻어서 생성자로 넘겨주는게.. 상식에서 거부했나 봅니다. 두번째 인자로 배열 범위를 벗어나는 값을 받는 이유를 혹시 아시는 분 계십니까? --zennith

  Iterator 들이나, 배열의 영역설정은 그 모호성을 배제하기 위해서, 마지막 자료형 + 1의  index 를 가지는 것을 상식으로 취급합니다. MFC, Java 등 여타 라이브러리들의 index접근 하는법 마찬가지 입니다. 익숙해 지는 수 밖에 없지 않을까요? --NeoCoin
=== 데이터 넣기 ===
ar.push_back(3);    // ar의 뒤쪽으로 3을 추가한다.
ar[5] = 4           // 6번째에 4 넣기
=== 컨테이너 순회 ===
vector<int>::const_iterator i;

// for 에서 반복자를 이용한 순회 1
for(i = ar.begin() ; i != ar.end() ; ++i)
    cout << *i << endl;    

// while 에서 반복자 이용순회
i = ar.begin();
while( i != ar.end() ) {
    cout << *i << endl;
    i++;
}

// for문에서 인덱스를 이용한 순회
for(int j = 0 ; j < ar.size() ; ++j)
    cout << ar[j] << endl;
=== 데이터 제거 ===
// 6번째 원소를 제거
ar.erase(ar.begin()+5);

// 2~3번째 원소 제거
vector<int>::iterator start, end;
start = ar.begin() + 1;   // 2번째 
end = start+2;            // 시작부터 2개 삭제
ar.erase( start, end);
=== Cook Book ===
=== Example ===
#include <vector>
#include <iostream>
using namespace std;

typedef vector<int> vecCont;
typedef vecCont::const_iterator vecIter;

int main()
{
	int ar[] = {32,54,654,765,34,4645625};
	vecCont nums(&ar[0], &ar[6]);

	for(vecIter i = nums.begin() ; i != nums.end() ; ++i)
		cout << *i << endl;
	
	for(int j = 0 ; j < nums.size() ; ++j)
		cout << nums[j] << endl;
	
	return 0;
}
 

벡터 비우기

  • 아래와 같은 방법으로 벡터 내용을 통째로 지운다.
	m_inputMessage.~vector<CString>();
	new ( &m_inputMessage ) vector<CString>();

See Also STL/VectorCapacityAndReserve


STL