假设我有一个充满这样点的向量:
vector<Point3f> cluster_points
现在,我在矢量中的每个点获得2点之间的距离。我想将所有这些数据存储在如下容器中:
{distance, (both point's index number from *cluster_points*)}
e.g。
{70.54, (0,1)};
{98.485, (1,2)};
{87.565, (2,3)};
{107.54, (3,4)};
如何在C ++ 11中执行此操作?
答案 0 :(得分: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。
答案 1 :(得分: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 };
或强>
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 };
答案 2 :(得分:2)
将数据存储在std::vector<std::tuple<float, std::pair<size_t, size_t>>>
。
不需要5或20或50个新代码行。