C++에서 int와 doubles (공칭 및 실수 값 데이터를 나타내는) 컬렉션을 저장해야합니다. 나는 분명히 그들 모두를 std::vector<double>
에 저장할 수 있지만 이것은 약간 잘못 생각하고 미학적 보너스 포인트를 얻지 못합니다.복소수와 정수의 혼합 된 컬렉션을 저장하는 가장 효율적인 방법
또한 다형성을 기반으로 무언가를 만들 수도 있지만 정말 효율적인 컬렉션이 필요합니다. 컬렉션에 데이터를 저장하고 검색하는 작업은 가능한 한 빨리해야합니다. 그런 해결책이 최대한 효율적인지 판단하기가 어렵습니다.
나는 또한 boost::variant을 발견했으며, 도움이 될 것입니다.
추가 정보 : 컬렉션의 항목 수가 작아서 (< 100) 컬렉션을 초기화 할 때 알 수 있습니다.
요약 : 나는 분명히 수많은 방법으로이 문제를 해결할 수 있지만 (i) 효율성이 정말 중요하고 (ii) 다소 훌륭한 코드를 작성하려고 할 때 어떤 것이 좋은 해결책이 될지 확신 할 수 없습니다. 내 최선의 내기는 무엇입니까?
편집 추가 정보 : 컬렉션은 더 큰 데이터 세트의 '행'을 나타내며 그 요소는 특정 '열'의 값을 나타냅니다. 행의 특성이 알려 지므로 어떤 위치에 어떤 종류의 데이터가 저장되어 있는지 알 수 있습니다. 필자가 말하고있는 '효율성'은 값의 빠른 설정이 중요하기는하지만 주로 특정 열의 int/double 값을 검색하는 효율성입니다. 가능한 한 빨리 검색해야하는 데이터에서 작동하는 몇 가지 기능이 있습니다. 예 : 좀 더 생각하고 지금까지 제안을 읽은 후
typedef std::vector<double> Row;
void doubleFun(Row const &row)
{
// Function knows there's always a double at index 0
double value = row[0];
...
}
void integerFun(Row const &row)
{
// Function knows there's always an integer at index 1
int value = row[1];
...
}
, 그냥 두 개의 벡터에서 INT 열 두 번 열을 저장하는 고체 해결책이 보인다. 그런 다음 컬렉션 은 함수가 사용할 수있는 명목 데이터와 실제 데이터를 검색하기 위해 두 개의 다른 멤버를 정의 할 수 있습니다.
그냥 vector<double>
으로 저장하는 것도 괜찮습니다.하지만 double과 int 사이의 변환이 얼마나 빠른지 (아마도 꽤 인상적입니다)에 달려 있습니다.
처음에는 약간 불명 한 점에 대해 사과드립니다. 더 명확하고 이제는 문제에 대해 좀 더 생각해 볼 수 있기를 바랍니다.
최상의 솔루션을 알기에 충분한 정보를 제공하지 못했습니다. - 컬렉션의 속성은 무엇입니까? 중복이 허용됩니까? 순서가 중요합니까? 정렬해야합니까? 데이터 유형을 보존해야합니까, 아니면 10.0 (double)을 삽입하고 10 (int)을 검색 할 수 있습니까? – Tom
또한 최적화하려는 효율성 측정 기준은 무엇입니까? 전체 공간? 삽입 시간? 무작위 액세스 조회 시간? 반복 시간? – Tom
추가 정보로 업데이트되었습니다. 처음에는 너무 명확하지 않아서 죄송합니다. 지금은 더 좋을 것 같네요. –