2017-07-13 36 views
3

比方說,我有一個滿點的載體是這樣的:2分向量中的每個點之間逼退多種類型的數據中的向量在C++

vector<Point3f> cluster_points 

現在我正在距離。我想將所有這些數據存儲在如下容器中:

{distance, (both point's index number from *cluster_points*)} 

例如

{70.54, (0,1)}; 
{98.485, (1,2)}; 
{87.565, (2,3)}; 
{107.54, (3,4)}; 

我該如何在C++ 11中做到這一點?

+0

製作一個簡單的POD結構,其中包含一個float/double用於距離和一個用於索引的pair/array。 –

+0

你有沒有試過?你有沒有進行任何研究?你有沒有想過通過你的問題,並提出任何想法? –

+0

@LightnessRacesinOrbit是的,我想到了,並提出了使用'std :: vector >>'的想法。但是有一個小問題。我不知道如何搜索一個單獨的元素?例如,如果我將執行'vector.at(4)',它會給我所有的東西,但我們只需要p1&p1而不是距離信息。 –

回答

4

在C++ 14:

struct DistanceBetweenPoints 
{ 
    double distance = {}; 
    size_t p1 = {}; 
    size_t p2 = {}; 
}; 

std::vector<DistanceBetweenPoints> foo; 
foo.push_back({ 70.54, 0, 1 }); 
//... 

編輯

就像Khouri Giordano在註釋部分提到的一樣,C++ 11不支持這個功能,因爲當使用類內初始化時,它變成了非POD類型,並且失去了整體構建。有關C++ 11兼容解決方案,請參閱他的answer

+0

爲什麼你將變量聲明爲'= {}'? – Chiel

+0

@Chiel它表示默認構造,即零。 –

+0

如果類型改變,初始化語法不會(即它更通用)。 –

2

製作一個結構來容納你想要的東西。給它適當的構造函數。

struct distance_indexes_t 
{ 
    double distance; 
    size_t p1, p2; 

    distance_indexes_t() 
     : distance(), p1(), p2() 
    {} 

    distance_indexes_t(double distance, size_t p1, size_t p2) 
     : distance(distance), p1(p1), p2(p2) 
    {} 
}; 
distance_indexes_t di1; // zeros 
distance_indexes_t di2{ 3.5, 4, 5 }; 

OR

struct distance_indexes_t 
{ 
    double distance = 0; 
    size_t p1 = 0, p2 = 0; 

    distance_indexes_t() = default; // Not necessary, but nice for clarity. 

    distance_indexes_t(double distance, size_t p1, size_t p2) 
     : distance(distance), p1(p1), p2(p2) 
    {} 
}; 
distance_indexes_t di1; // zeros 
distance_indexes_t di2{ 3.5, 4, 5 }; 

都將使用默認的拷貝構造函數和賦值運算符。移動構造函數和移動運算符在這裏並不重要,但是你也會得到這些默認值。

或者,對於C++ 14:

struct distance_indexes_t 
{ 
    double distance = 0; 
    size_t p1 = 0, p2 = 0; 
}; 
distance_indexes_t di1; // zeros 
distance_indexes_t di2{ 3.5, 4, 5 }; 

或者,對於C++ 03和更早:

struct distance_indexes_t 
{ 
    double distance; 
    size_t p1, p2; 
}; 
distance_indexes_t di1; // random content 
distance_indexes_t di2{ 3.5, 4, 5 }; 
+0

在C++ 11中,我不會聲明任何構造函數。您可以像這樣簡單地爲POD類型使用聚合初始化,並使用默認值的類內初始化。 –

+0

課堂上的初始化是一個C++ 11功能,而不是C++ 14。 –

+0

是的,但是這是C++ 11中的非POD,你會失去總體構造。 –

2

將數據存儲在std::vector<std::tuple<float, std::pair<size_t, size_t>>>中。

不需要5或20或50個新的代碼行。

+1

儘管我確實同意最小化代碼量,但我認爲它會使代碼更難讀取。而且,訪問元組的元素對於這樣的微不足道的情況來說有點尷尬。 –

+1

元組非常適用於您不知道類型甚至類型的模板。對於其他用途,創建一個結構更清晰。 –

+0

@JérémiP.:一個或兩個typedef會修復 –