2013-05-18 1 views
1

본질적으로 C 배열 및 길이 인 "ntuple"이라는 컨테이너가 있습니다. 주요 목적은 다차원 수학 함수의 논증입니다. 현재로서는, 정말 빨리하고 양식불필요한 경우에도 반복자를 구현 하시겠습니까? C++

ntuple(double x, double y, double z) 
{ 
    size = 3; 
    vec = new double[size]; 
    vec[0] = x; 
    vec[1] = y; 
    vec[2] = z; 
} 

그리고 더 높은 차원, 아직 알려지지 기능을 작동 할 때마다 여러 생성자를 이용, 난 그냥 새로운 생성자를 추가합니다. 나뿐만 아니라 배열에 대해이 있습니다

ntuple(double* invec, long unsigned insizesize) 

일반 C++ 코드 내 코드를 더 호환되도록하기 위해, 나는 ntuple 반복자를 구현해야합니까? 내가 한 모든 일은 하나를 필요로했으며, 모든 일을 늦추는 것처럼 보입니다. 그러나 더 많이 읽을수록 표준 C++ 코드와의 호환성을 위해 반복자를 사용하는 것이 더 중요해집니다.

다른 사람이 내 코드로 작업하려고 할 때 사용하려고하는 표준 기술과 잘 맞지 않을까 걱정됩니다. 하지만 제 ntuple 클래스의 목적은 함수에 인수를 취하는 것입니다.

코드를 느리게하는 대신에 반복자를 예방책으로 구현해야합니까 (다른 사람이 STL을 사용하려고 시도하는 경우)?

감사합니다.

+0

제대로 구현 된 반복자는 다른 것의 속도에 영향을주지 않습니다. –

+0

'ntuple'이'std :: vector '이 아닌 이유가 있습니까? 그 이유가 좋은거야? – Yakk

+0

@Yakk 예, 내 인수가 차지하는 공간을 최소화합니다. 이 프로그램은 방정식의 방대한 시스템을 해결합니다. 수학에서 함수의 인수는 함수 전체에서 변경되지 않기 때문에 push_back이나 다른 것이 필요하지 않습니다. – user2303321

답변

5

C 배열 주위의 래퍼에 대한 반복자를 구현하는 것은 간단합니다. 각각 beginend의 첫 번째 요소와 마지막 하나의 요소에 대한 포인터를 반환하고 POD 클래스에 가상이 아닌 메서드를 추가합니다. 무엇이든 많이 감속하지 않습니다. 이러한 메소드를 통해 배열에 액세스하면 배열 색인 조회를 사용하는 것보다 속도가 느려지지 않으며 일부 컨텍스트에서는 더 빠를 수 있습니다. 사용하지 않으면 코드가 느리게 실행되지 않습니다. 당신이 beginend 방법이있는 경우 C++ 11 장점으로

std::beginstd::end은 그것을 발견 할 것이다, 그리고 for(auto x: container) { /* code */ }은 종류에 작동합니다.

X/Y 문제인 것으로 보이므로, 귀하의 문제 중 하나는 귀하가 ntuple 클래스를 전혀 사용하지 말아야한다는 것입니다. std::vector<double>은 이미 잘 작성된 C 스타일 배열 주위의 얇은 래퍼입니다. 복사 비용없이 전달하려면 std::vector<double> const&.

STL은 페르시아어를 제외하고 std의 템플릿 구성 요소가 파생 된 라이브러리를 참조합니다. 몇 가지 점에서 std 라이브러리와 약간 다릅니다.

0

예, 벡터를 사용하지만 (실제로 많은 양의 데이터가있는 경우) 벡터의 메모리를 관리하는 데 매우주의하십시오. 그렇다면이 4 바이트 오버 헤드 (용량에 낭비)가 실제로 생깁니다.

  • 가에 allways 비어 사용 크기 조정을 명시 적으로 크기와 벡터를 만들거나 생성() 당신이 인덱스를 사용하여
  • 채우기 벡터 (로 VEC [0] = ...)
  • 가와 push_back 사용하지 않습니다 -이 두 번 (요청할 수 있습니다)

당신은이이

class ntuple: public std::vector<double> { 
private: 
    typedef std::vector<double> super; 
    void push_back(double); // do not implement 
    // also forbid pop_back() 
public: 
    ntuble(double a, double b) { 
     resize(2); 
     (*this)[0] = a; 
     (*this)[1] = b; 
    } 
    ntuple(double* invec, long unsigned size) 
     : super(invec, invec + size) 
    { 
    } 
    // all your other convenient constructors here 
}; 
처럼) 때로는 이러한 행위는하지 않는 것이 좋습니다 불구하고 (벡터 상속과 규칙을 적용 할 수 있습니다 필요한 것보다 더 많은 메모리를

begin() 및 end() 메소드를 사용하여 반복기에 계속 액세스 할 수 있습니다.

관련 문제