在c ++中向量中推送多种类型的数据

时间:2017-07-13 12:42:18

标签: c++ c++11 vector

假设我有一个充满这样点的向量:

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中执行此操作?

3 个答案:

答案 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个新代码行。