2015-01-29 6 views
1

bitset의 2D 배열을 작성해야하며 사용자의 배열 크기는 bitset으로 지정하고 싶습니다. 템플릿과 값은 const이어야합니다. 어떻게하면됩니까?입력 인수를 기반으로 C++ 배열을 초기화하십시오.

int main(int argc, char* argv[]) { 
int const LEN ; 
int const NUMBER; 
if (argc == 3) 
{ 
    LEN = atoi(argv[1]); 
    NUMBER = atoi(argv[2]); 
} 
else{ 
    LEN = 1000; 
    NUMBER = 800; 
} 
bitset<LEN> b[NUMBER]; 
} 

답변

2

, 당신은 속일 수 있습니다.

// invokes target<i>{}() if i >= min and i < max 
template<template<size_t>class target, size_t max, size_t min=0> 
struct magic_switch { 
    void operator()(size_t i) const { 
    constexpr size_t mid = (min+max-1)/2; 
    if (i==max-1) target<max-1>{}(); 
    else if(i<mid) magic_switch<target, mid,min>{}(i); 
    else magic_switch<target, max-1,mid>{}(i); 
    } 
}; 
template<template<size_t>class target, size_t min> 
struct magic_switch<target, min, min> { 
    void operator()(size_t i) const {} // do nothing 
}; 
int number; 
template<size_t len> 
struct program { 
    template<size_t number> 
    struct p2 { 
    void operator()() const { 
     std::bitset<len> arr[number]; 
     // code 
    } 
    }; 
    void operator()() const { 
    magic_switch<p2, 1001, 1>{}(number); 
    } 
}; 

int main(int argc, char const* argv[]) { 
    int len; 
    if (argc == 3) 
    { 
    len = atoi(argv[1]); 
    number = atoi(argv[2]); 
    } 
    magic_switch<program, 1001, 1>{}(len); 
} 

물론이 접근법은 완전히 나쁜 생각입니다.

기본적으로 각 len x 숫자에 대해 하나씩 10000000 개의 프로그램을 만들었고, 어느 프로그램을 실행할지 결정하기 위해 거대한 체인을 만들었습니다.

이것은 프로그램에 대한 포인터를 배열에 저장 한 다음 20 회의 재귀 대신 배열 조회를 수행하면 더 효율적으로 만들 수 있습니다. 여전히 나쁜 생각입니다.

이 솔루션을 사용하지 마십시오. 왜 그것을 사용하지 말아야하는지 이해하지 못한다면, 나를 믿으십시오. 왜 사용하지 말아야하는지 이해한다면,이 단락은 중복됩니다.

더 빠른 magic_switch (일부 컴파일러는 그것을 좋아하고, C++ 14 개 기능을 사용하지 않습니다),

여기
template<template<size_t>class target, size_t max, size_t min=0> 
struct magic_switch { 
    template<size_t...Is> 
    void operator()(std::index_sequence<Is...>, size_t i) { 
    using task = void(*)(); 
    static const task arr[] = { 
     []{ target<min+Is>{}(); }... 
    }; 
    arr[i-min](); 
    } 
    void operator()(size_t i) const { 
    (*this)(std::make_index_sequence<max-min>{}, i); 
    } 
}; 

우리는 (A static const 배열) 점프 테이블을 구축, 조회 작업을 수행하고 그것을 실행하십시오./걸릴 인수를 반환하는이 확장

는 상대적으로 쉽다 다음 number 변수가 세계적으로 저장 요구 사항을 멀리 걸릴 것이 하나를 사용

template<class Sig, template<size_t>class target, size_t max, size_t min=0> 
struct magic_switch; 
template<class R, class...Args, template<size_t>class target, size_t max, size_t min> 
struct magic_switch<R(Args...), target, max, min> { 
    template<size_t...Is> 
    R operator()(std::index_sequence<Is...>, size_t i, Args&&...args) { 
    using task = R(*)(Args&&...); 
    static const task arr[] = { 
     [](Args&&...args)->R{ 
     return target<min+Is>{}(std::forward<Args>(args)...); 
     }... 
    }; 
    return arr[i-min](std::forward<Args>(args)...); 
    } 
    R operator()(size_t i, Args...args) const { 
    return (*this)(
     std::make_index_sequence<max-min>{}, 
     i, 
     std::forward<Args>(args)... 
    ); 
    } 
}; 

. 전역 변수가 나쁜 습관이기 때문에 코드가 향상됩니다.

+0

답장을 보내 주셔서 감사합니다. 성능 때문에 비트 세트를 사용해야합니다.하지만 Vector로 전환하고 문제를 해결하는 것이 더 좋습니다. 어쨌든 감사합니다. – Am1rr3zA

+0

@ am1rr 나는 상대적인 성능에 대해 잘못된 가정을하고 있다고 생각한다. – Yakk

+0

과용과 같은 킬은 없다. – David

4

수 없습니다. bitset을 사용하려면 컴파일 할 때 크기를 알아야합니다. 대체로 vector<bool>을 사용할 수 있습니다. 실제로는 약간의 벡터이지 실제 bool의 벡터는 아닙니다.

+0

내 자신의 참고로, 나는 보통 그 비트 켓을 알고 있지만, 비트셋으로 보장됩니까? – IdeaHat

+0

비트 셋을 사용해야하는데, 나는 벡터를 사용하고 싶지 않다. – Am1rr3zA

+0

@ Am1rr3zA 내 유일한 조언은 꼭 필요한 것보다 확실히 큰 '비트 세트'를 사용하는 것이다. 그러나'비트 셋 '을 사용하지 않아도됩니다. '벡터 '는 기본적으로 같습니다. – David

0

간단한 대답은 - 당신이 할 수 없다는 것입니다. std::bitset은 컴파일 시간 값을 사용합니다.

당신은 vector<bool>를 사용하거나 부스트 라이브러리의 dynamic_bitset : 당신은 당신이 사용할 수있는 방법에 큰 비트 세트 크기에 제한을 설정할 수 있습니다 경우

http://www.boost.org/doc/libs/1_57_0/libs/dynamic_bitset/dynamic_bitset.html

+0

비트 셋을 사용해야하는데, 사용자로부터 크기를 얻을 수 있도록 트릭이 없나요? – Am1rr3zA

+0

아니요, 트릭이 없습니다. 그리고 왜 "나는 사용해야한다"...? 무엇이 벡터 또는 부스트 라이브러리를 사용하지 못하게합니까? – PaulMcKenzie

관련 문제