2011-04-11 3 views
1

저는 C++로 무언가를 쓰고 싶습니다. 아이디어가 있지만 그것을 작성하려고 시도했지만 어떻게 해야할지를 깨닫지 못합니다.벡터를 그 속성에 따라 더 작은 벡터로 나눕니다.

설명

나는 우리가 eveytime 우리가 우리의 프로그램을 실행 정의한 vector<int>을 가지고 상상해보십시오. 그 이름은 mainVector입니다.이 벡터는 무작위 수의 int를 갖습니다. 모든 int에는 속성이 있습니다.

예를 들어 다음과 같은 값을 가진 벡터가 있습니다 : vector<int> mainVector {1, 3, 15, 33, 35, 42, 57, 69, 73}; 우리가 예를 들어 properties라는 요소의 위치에 mainVector의 모든 요소의 특성을 설명하는 또 다른 vector<int> : vector<int> properties {1, 1, 1, 2, 2, 2, 3, 3, 3}

내가 지금 원하는 것은 서로 다른 많은 작은 벡터의 첫 번째 벡터를 분할하는 것입니다 속성이 존재합니다. 예를 들어, 마지막 경우에 새 벡터가 세 개 있습니다. 속성이 1 인 요소가있는 벡터 : 1, 3, 15; 재산 2를 가진 성분을 가진 벡터 : 33, 35, 42; 및 속성 3 요소가있는 벡터 : 57, 69, 73.

문제는 이것을 정의하는 방법을 모르므로 첫 번째 벡터가 코드를 실행할 때마다 다를 수 있기 때문입니다.

여기 내 아이디어를 당신에게 코드를 첨부 :

do 
{ 
    for(int t=0;t<mainVector.size();t++) // id tables 
    { 
     string Vect("Vector"); 
     Vect +=t; 
     vector<int> Vect 

     for(int u=0;u<mainVector.size();u++) 
     { 
      if(properties.at(u) & t) 
      { 
       Vect.push_back(mainVector.at(u)); // I know this is not correct but I hope you understand what I mean 
      } 
     } 
    } 
} 

감사를 사전에 모두에게! :)

해명 내가 명확히하려는

뭔가 중요한 : mainVector 이미 imput 덕분에 정의 된 또 다른 더 큰 벡터의 서브 벡터이다. bigVector <int>{1, 2, 3, 4, 5, 6, ...., 99, 100, 101, ..., n}이고 vector <int> properties은 사실상 어떤 경우에도 다를 수있는 큰 빅 벡터이므로 예를 들어 하나의 실행에서 나는 {1, 1, 1, 1, 1, 1, ..., 1, 1, 2, ... 2} 일 수 있고 다른 순간은 {1, 1, 1, 1, 2, 2, ..., 26, 26, 27, 49} 일 수 있으므로 벡터를 할 수 없다고 생각합니다. 당신 중 일부는 추천, 어떤 아이디어로 벡터 ??

다시 한번 감사드립니다 !!!

답변

2

"속성"벡터에서 다른 유형의 수를 셀 수 있으며 벡터 벡터 (vector<vector<int>>)를 만들 수 있습니다. 그런 다음 두 번째 벡터를 반복하고 첫 번째 벡터의 점을 새 벡터 구조의 해당 인덱스에 추가합니다. 같은

뭔가 :

bool Contains(vector<int> x, int value) 
{ 
    bool bContains = false; 
    for(int ii=0; ii<x.size(); ++ii) 
    { 
     if(x[ii] == value) 
     { 
      bContains = true; 
      break; 
     } 
    } 

    return bContains; 
} 

int GetIndex(vector<int> x, int value) 
{ 
    int nIdx = -1; 
    for(int ii=0; ii<x.size(); ++ii) 
    { 
     if(x[ii] == value) 
     { 
      nIdx = ii; 
      break; 
     } 
    } 

    return nIdx; 
} 

int main() 
{ 
    const int SIZE=10; 

    vector<int> x(SIZE); 
    vector<int> y(SIZE); 
    for(int ii=0; ii<SIZE; ++ii) 
    { 
     x[ii] = ii*SIZE+4; 

     if(ii < SIZE/2) 
      y[ii] = 0; 
     else 
      y[ii] = ii/3; 
    } 

    vector<int> unique(SIZE, -1); 
    int nCount = 0; 
    for(int ii=0; ii<y.size(); ++ii) 
    { 
     if(!Contains(unique, y[ii])) 
      unique[nCount++] = y[ii]; 
    } 
    unique.resize(nCount); 

    vector<vector<int>> answer(nCount); 
    for(int ii=0; ii<y.size(); ++ii) 
     answer[GetIndex(unique, y[ii])].push_back(x[ii]); 

    return 0; 
} 
+0

답장을 보내 주셔서 감사합니다. 나는 내 질문을 명확히했다. 왜냐하면 내가 추천 한대로 벡터 >으로 그 일을 할 수 없다고 생각하기 때문이다. 당신이 그것을하는 방법을 알고 있다면 좀 봐봐! 고마워요 :) – thomas

+0

나는 여전히 벡터 벡터가 효과가 있다고 생각합니다. 다시 말하려는 노력을 할 수 있습니까? 데이터로 무엇을하고 싶습니까? 서브 벡터의 새로운 "객체"로 무엇을하고 싶습니까? – Jess

+0

위의 솔루션을 편집했습니다 ... 찾고있는 솔루션인지 확실하지 않습니다? – Jess

0

당신은 INT의 벡터의 벡터를 사용하여, 즉 vector< vector<int> >입니다. 사용자 정의 클래스 또는 쌍

vector<pair<int, int> >

의 벡터 이것은 당신이 일치하지 않는 점점 속성의 가능성이없는 벡터를 정렬 할 수 있습니다를 포함하는 벡터를해야 하나처럼

+0

답변 해 주셔서 감사합니다. 나는 내 질문을 명확히했다. 왜냐하면 내가 추천 한대로 벡터 >으로 그 일을 할 수 없다고 생각하기 때문이다. 당신이 그것을하는 방법을 알고 있다면 좀 봐봐! 감사합니다 :) – thomas

0

는 소리가 난다.

+0

답변 주셔서 감사합니다. 나는 내 질문을 명확히했다. 왜냐하면 나는 당신이 추천하는대로 벡터 >로 할 수 없다고 생각하기 때문이다. 당신이 그것을하는 방법을 알고 있다면 좀 봐봐! 감사합니다 :) – thomas

0

사용자는 키의 속성 값과 그 속성 값이 모든 요소를 ​​포함하는 서브 벡터이다 vector<int>int에서 map을 설정할 수있다.

+0

당신의 대답에 감사드립니다. 나는 int에서 vector로지도를 가지고 그것을 할 수 없다고 생각하기 때문에 나의 질문을 명확히했다. /실제로, 나는 시험했지만, 나는 결코지도와 함께 일한 적이 없다. 그러나 나는 내가 원하는 것을 결코 얻지 못했다. : S 나의 설명을 한 번보고 어떻게하는지 알고 싶다면 말해주세요! 감사합니다 :) – thomas

0

이미 수행하려는 작업을 수행하는 알고리즘이 있습니다. 당신이 mainVector 변경되지 않고 유지하면서, 술어를 충족 다른 벡터 resultsmainVector에있는 모든 요소의 사본을 확인하려면

, 당신은 copy_if 사용할 수 있습니다

copy_if(mainVector.begin(), mainVector.end(), back_inserter(results), MyPredicate()); 

당신이 동일한 작업을 수행하려면 제외하고 위의 mainVector에서 해당 항목을 분리 할 때, 당신은 remove_copy_if를 사용할 수 있습니다

mainVector.erase4(copy_if(mainVector.begin(), mainVector.end(), back_inserter(results), MyPredicate()), mainVector.end()); 
2

는 각 소품을 추적 할 std::map<int, std::vector<int>>을 사용할 수 있습니다 erty 및 그 재산과 관련된 번호. 예 : (당신이 준 예제 데이터)

typedef std::vector<int> vec_t; 
typedef std::map<int, vec_t> map_t; 

// the real work 
map_t propMap; 
for (vec_t::size_type i = 0u, i_end = mainVector.size(); i != i_end; ++i) 
    propMap[properties[i]].push_back(mainVector[i]); 

// printing the results 
for (map_t::const_iterator miter = propMap.begin(), miter_end = propMap.end(); 
     miter != miter_end; 
     ++miter) 
{ 
    std::cout << "all numbers with property value of " << miter->first << ':'; 
    for (vec_t::const_iterator viter = miter->second.begin(), viter_end = miter->second.end(); 
      viter != viter_end; 
      ++viter) 
    { 
     std::cout << ' ' << *viter; 
    } 
    std::cout << std::endl; 
} 

인쇄 : 33 35 : 1 3 15
2의 속성 값을 가진 모든 숫자 : 1의 속성 값과

모든 숫자 42
모든 속성 값 3 : 57 69 73

+0

답변 주셔서 감사합니다. 아직 C++의 초기 레벨에 비해 상당히 복잡해 보입니다. 그러나 나는 이해했다고 생각합니다. 어쨌든, 난 그냥 내 질문을 명확히하고, 당신은 그것을 확인하고 대답을 여전히 유효하다고 생각한다면 말해 줄 수 있습니까 ?? 그것을 쓰는 것이 더 쉬운 방법일까요 ?? 미리 감사드립니다! :) – thomas

+0

@thomas : 여기서 유일한 요구 사항은'mainVector'와'properties'는 길이가 동일하다는 것입니다. 그 너머에 모든 명확한 설명이 바뀌는 지 모르겠다. – ildjarn

+0

@thomas : 실제로 새 벡터를 만드는 코드는 3 줄 밖에 없다 (실제 작업의 주석). 3 라인을 정말로 더 단순화해야합니까? ; -] (나머지 코드는 결과를 출력하기위한 것이므로 복잡성 수준이 무의미한 것 같습니다.) – ildjarn

관련 문제