2013-07-22 2 views
2

배열 내의 범위를 반환하는 함수를 작성해야합니다 (원하는 경우 시작 위치와 길이로 지정되어 있다고 가정 할 수 있습니다). 튜플을 반환 할 수 없기 때문에 다른 형식을 반환해야합니다 (어쨌든 좋은 생각 일 수도 있습니다). 지금, 나는 모두 (어느 정도) 표준이고 등으로 인해 vtable을, 복잡한 ctors범위 (배열 인덱스)에는 어떤 유형을 사용해야합니까?

마음에 와서 옵션에 성능 저하를 발생하지 않는 무언가를 반환하고 싶은 것은 다음과 같습니다

  1. std::pair<unsigned> (또는 std::pair<size_t>).
  2. 구조체는 unsigned (또는 size_t의 두 개)을 래핑합니다.
  3. 내 자신의 Range 클래스를 굴리고 실용적인 방법으로 설탕 코팅하십시오.

적절한 Range 클래스를 찾으려고 시도했지만 찾을 수 없습니다. 표준 라이브러리/STL에서 클래스에 대해 범위를 사용하지 않는 것은 이상한 일입니다.

더 좋은 대안이 있습니까? 그리고 그렇지 않은 경우 위의 권장 사항 중 어느 것이 좋습니다?

+1

반복자 쌍? – ForEveR

+0

@ForEveR : 성능면에서 합리적인 것으로 보이지 않습니다. 또한,이 범위의 사용에 필요하지 않은 추상화의 또 다른 측면을 추가합니다. 어떤 코드는 반복을 위해 그것을 사용할 수 있고, 다른 코드는 말하자면'memcpy()'배열의 일부일 수 있습니다. – einpoklum

+1

@einpoklum bullshit. 포인터는 반복자입니다. 반복자가 합리적인 퍼포먼스에 부합하지 않는다고 가정하면 초점 맞추기 중심의 프로그래밍에 꽤 많은 액수가 걸린다. –

답변

2

이것이 답하기 어려운 주된 이유는 범위가 사용될 상황의 유형이 명확하지 않다는 것입니다. 심지어 당신은 아마 아직 정확하게 모른다.

이와 같은 상황에서는 유연하게 유지하기 때문에 고유 한 클래스를 만드는 것이 좋습니다. 필요에 따라 멤버 함수와 중첩 된 typedef를 추가 할 수 있습니다.

마지막으로 모든 유스 케이스가 지워지고 모든 멤버 함수와 보조 함수가 정의 된 경우 쌍으로 대체 될 수 있다고 판단되면 클래스를 여전히 typedef으로 바꿀 수 있습니다.

이 범위의 엄청난 양을 저장하려는 경우가 아니면 안쪽 유형에 대해 반복자를 사용하는 것이 좋습니다 (공간 최적화가 중요하고 공간을 절약하는 데 도움이되는 두 개의 정수 (오프셋 + 길이)).

+0

글쎄, 내가 뭔가를 원한다 ('templated'가 아닌) 일반적인 것. 연속되는 부분 문자열이나 서브 벡터를 얻기 위해'string'이나'vector' 메쏘드에 인수로서 넘겨 줄 것입니다. (그래도, 범위를 가지지 않습니다.) – einpoklum

+0

@einpoklum 이해가 안됩니다. 말했듯이'std ::'컨테이너와 알고리즘의 함수는 범위 인수를 취하지 않습니다. 쌍도 아니고. 그들은 두 개의 분리 된 반복자 인수로 작동합니다. 따라서 이들을 호출하려면 사용자 정의 된 코드를 _any_ case에 작성해야합니다. – jogojapan

+0

나는 단지 내가 원하는 일반성을 강조하려고했다. 이론적으로 * 표준 라이브러리에 들어갈 수있을 정도로 간단하고 일반적인 목적입니다. 내 사용과 관련이있는 것이 아닙니다. – einpoklum

0

개인적으로 범위에 대해 별도의 클래스를 작성합니다. 가상 호출이 없으면 적절한 메소드를 호출하기위한 오버 헤드가 거의 발생하지 않으며 union, intersection, shift, clamp 등과 같은 범위 별 작업을위한 내부 메소드를 자유롭게 정의 할 수 있습니다.

+0

그러나 이것은 사람들을위한 시간의 zillions를 온다! 확실히 우리는 우리 자신의 개별 Range 클래스를 작성해서는 안된다 ... – einpoklum

+0

우리는 목록이나 다른 컨테이너에서 다양한 변형을하기 때문에 그 문제에 관해서. 이 클래스를 다시 작성하고 싶지 않다면 툴박스 라이브러리에 넣기 만하면됩니다.이 클래스를 최대한 재사용 할 수 있도록 작성하고 나중에 나중에 다시 쓸 필요가 없도록 향후 프로젝트에 포함하십시오. – Spook

0

배열 내의 범위를 반환하는 함수를 작성해야합니다. 원하는 경우 시작 위치와 길이로 지정했다고 가정 할 수 있습니다.

반복기 쌍을 그룹화해야하는 것처럼 들립니다.

튜플을 반환 할 수 없으므로 다른 형식을 반환해야합니다. 어쨌든 좋은 생각입니다.

당신이 튜플을 반환 할 수 있지만, 한쌍의 반복자를 반환 시도 할 수 있습니다, 또는 한쌍의 반복자 주위에 자신의 구조체를 만드는 (당신이 std::pair 반환 할 수없는 경우) 왜 확실하지.

자, 모두 (어느 정도) 표준이고 등으로 인해

vtable을, 복잡한 ctors에 성능 저하를 발생하지 않는 무언가를 반환하고 싶습니다 반복자 한 쌍의 좋은 :) 소리 (부러진 레코드처럼 들립니다.)

적절한 Range 클래스를 찾으려고 시도했지만 찾을 수 없습니다. 표준 라이브러리/STL에서 클래스에 대해 범위를 사용하지 않는 것은 이상한 일입니다.

부스트를 사용할 수 있다면 boost::range이 있습니다. 당신이 그것을 사용할 수 없다면 당신은 당신 자신의 것을 굴릴 수 있습니다. 나는 한 쌍의 반복자 (: -)를 사용할 것이다.

[...] 더 좋은 대안이 있습니까? 그리고 그렇지 않은 경우 위의 권장 사항 중 어느 것이 좋습니다?

예 : 표준 호환, 빠르며 관용적이며 복잡한 건설이나 vtable 오버 헤드가 발생하지 않으며 안전합니다. 그것은 또한 최소한의 놀라움의 원칙을 따른다.

+0

하지만 범위에 대한 특정 형식을 원합니다. 한 쌍의 반복자를 통해 범위 클래스를 정의 할 것을 제안하고 있습니까? 또한 반복자는 본질적으로 변경 가능합니다 (const를 사용할 수는 있지만 그 목적을 달성 할 수는 없습니다). 범위는 본질적으로 변경되지 않습니다. – einpoklum

관련 문제