|
WAHSHIP님 친철한 답변과 코드에 감사 드립니다.
vector template에 다시 vector 를 쓸수 있는줄 몰랐습니다.
template과 vector란 개념에 대해 다시 공부를 해야 할 것 같습니다 ^^;
아주 중요한 부분을 일깨워 주셔서 감사합니다.
WASHIP님의 코드는 제가 실행해 봤는데 완벽하게 잘 돌아갑니다.
참고로 저는 Low-Density Parity Check code 를 공부하고 있고요,
분야는 Applied Coding Theory 입니다.
혹 정보가 필요하시면 ㅎㅎ...
다음과 같이
vector< vector<int> > cnodes; 를 사용하여 해결했습니다.
=================================================================
vector< vector<int> > cnodes;
vector<int> itemp;
for(int i=0; i<CdegreeSet.size();i++)
{
for(int j=0;j<CdegreeSet[i];j++)
{
itemp.push_back(VedgeSet[j]);
}
cnodes.push_back(itemp);
itemp.erase(itemp.begin(),itemp.end());
VedgeSet.erase(VedgeSet.begin(), VedgeSet.begin()+CdegreeSet[i]);
}//<----end of outer "for" loop
VdegreeSet.clear();
CdegreeSet.clear();
VedgeSet.clear();
=================================================================
WARSHIP 님이 쓰신 글 :
: #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은 안통할것 같아서요.
: : 좋은 답변 부탁드립니다.
|