|
#include <vector>
#include <algorithm>
#include <stdio.h>
using namespace std;
template <typename T>
void SliceVector(vector<T> &orig , vector< vector<T> > &Target , int size )
{
/* size 가 0이면 리턴 */
if(size==0) return;
/* 오리지날 벡터의 초기 위치 설정 */
vector<T>::iterator pos=orig.begin();
/* 몇개로 잘라질지 계산, +1의 이유는 마지막에 */
unsigned int SliceSize = orig.size()/size;
Target.resize(SliceSize+1);
/* size 만큼씩 Target벡터에 대입 */
for(unsigned int i=0;i<SliceSize;++i)
{
Target[i].assign(pos,pos+size);
pos+=size;
}
/* Original 백터가 size로 딱 나누어 떨어지지 않을경우
끝의 남은것들을 Target의 마지막에 집어넣어줌 */
if ( (orig.size()%size) != 0 )
(Target.back()).assign(pos,orig.end());
/* 나누어 떨어진다면 여유로 넣어놨던 마지막 vector<T>를 삭제함 */
else
Target.pop_back();
}
int main(int argc, char *argv[])
{
vector<int> original;
vector< vector<int> > SliceVec;
original.reserve(1000);
for(int i=0;i<1000;++i ) original.push_back(i);
/* Slicing */
SliceVector(original,SliceVec,20);
printf("Sliced vector size : %d\n",SliceVec.size());
for(unsigned int i=0;i<SliceVec.size();++i)
{
printf("\nSliceVec[%d].size() = %d\n",i,SliceVec[i].size());
for(unsigned int j=0;j<SliceVec[i].size();++j)
printf("%4d",SliceVec[i][j]);
}
return 0;
}
더이상의 설명은 생략 ^^;
좋은하루 보내시길 바랍니다.
assign,resize,reserve 함수를 잘 이용하면 좀더 효과적일수 있습니다. ^^;
kalamazu 님이 쓰신 글 :
: 안녕하세요.
: 제목처럼 vector 객체를 원하는 갯수만큼의 sub vector로 자를수 있는 방법이 필요해서요.
: 질문을 좀더 구체적으로 설명하면,
: 예를 들어서
:
: vector<string> vs;
: vs="this:is:a:test.......";
:
: 이런 식으로 선언하면
:
: for (int i=0;i<vs.size();i++)
: {
: vs=vs.substr((vs.find(":")+1));
: }
: 이런식으로 string vector 인 vs를 vs[1], vs[2], vs[3] 세개로 자를수 있잖습니까?
:
: 그러면 이번엔
:
: vector<int> intv;
: 로 선언하고
:
: 다음과 같이 값을 채워 넣은다음
: for(int i=0; i<1000;i++)
: {
: intv.push_back(i);
: }
:
: 그다음,
: int N=20;
:
: 이제 제 질문은 intv 벡터를 N=20개의 서브벡터로 잘라낼수 있는 방법이 없습니까?
: vs의 경우 string 벡터라서 구분자를 사용하여 substr를 이용하여 잘라낼수 있었습니다만...
: intv의 경우 string 벡터가 아니라서 substr은 안통할것 같아서요.
: 좋은 답변 부탁드립니다.
|