带有 std::vectors 的图形?

Posted

技术标签:

【中文标题】带有 std::vectors 的图形?【英文标题】:Graph with std::vectors? 【发布时间】:2019-10-17 18:52:15 【问题描述】:

我认为使用向量的一种很酷的方法是让一个向量类模板保存两个单独的 int 变量,用于绘制 x/y 坐标。

示例:

std::vector<int, int> *name*;
// First int. being the x-intercept on a graph
// Second int. being the y-intercept on a graph

(我也明白我可以只制作每个偶数/奇数位置或两个单独的向量来对每个 x/y 坐标进行分类,但对我来说,我只是想看看这是否可行)

但是,在创建此向量类型后,我遇到了一个问题,即分配向量中的哪个 int 将被写入或从中提取。谁能告诉我如何适当地优化 selectstd::cout 两个 x/y 整数?

附: - 我以这种方式使用向量的主要目标是向 Visual Studio 终端输出一个非常基本的图形。同时能够通过“选择”并在需要时进行更改来更改单个 x/y 截距。这些坐标将通过 for/while 循环输出到终端。

另外,有人想列出不同的方法来最好地使用不同的容器制作 x/y 坐标吗?

【问题讨论】:

向量是一种动态数组,作为数组,它的元素只能是单一类型。您需要与std::vector 结合使用的其他数据结构才能处理成对的值,例如std::pair 【参考方案1】:

您的问题相当广泛,换句话说,它要求的有点太多了。我将尝试为您提供一些建议,您可以从中找到自己喜欢的方式。

A) 等距 x

如果您的x 值是等距的,即0, 0.5, 1, 1.5,则无需存储它们,只需使用一个

std::vector<int> y;

如果在编译时不知道变量的个数,否则一个

std::array<int,N> y;

B) 任意 x

有几个选项取决于您实际想要做什么。对于简单地存储(x,y)-pairs 并将它们打印在屏幕上,它们都同样有效。

地图

std::map<int,int> map_x_to_y =   1,1, 2,4, 3,9;
// print on screen
for (const auto& xy : map_x_to_y) 
   std::cout << xy.first << ":" xy.second;

一对向量

std::vector<std::pair<int,int>> vector_x_and_y =   1,1, 2,4, 3,9;

在屏幕上打印实际上与map 相同。 map 的优点是它的元素是有序的,而 vector 则不是这样。

C) 不使用任何容器

对于轻量级计算,您可以考虑根本不存储 (xy) 对,而只需使用函数:

int fun(int x)  return x*x; 

TL;DR / 更专注

向量存储一种类型。您不能拥有std::vector&lt;int,int&gt;。如果您查看std::vector 的文档,您会发现第二个模板参数是一个分配器(您可能有一段时间不必关心)。如果要将两个值作为一个元素存储在向量中,则必须使用 std::vector&lt;std::pair&lt;double,double&gt;&gt; 或其他容器。

PS

我在上面的例子中使用了std::pair。但是,我确实认为尽可能命名事物是一种好习惯,并在我无法给出比 firstsecond 更好的名称的情况下留下 std::pair。本着这种精神,您可以将上述示例中的 std::pair 替换为

struct data_point 
    int x;
    int y;
;

【讨论】:

这就是我想要的!你的“一对向量”的例子是我试图解释的。我只是不太了解如何使用 std::pair。 @DanielEscobedo 似乎 tl;dr 就足够了;)。关于std::pair 的了解不多。它包含两个值,称为firstsecond,基本上就是这样 @DanielEscobedo 注意 PS,std::pair 相当有用,但经常使用更明确的东西可以使代码更具可读性 @DanielEscobedo 直到现在我才意识到在地图中使用 double 作为键可能会出现问题。我将示例中的所有double 改回int。如果您需要doubles,请给我留言。 @DanielEscobedo 您必须分别阅读 firstsecond,就像阅读 ints 一样。不要误会我的意思,但 cmets 不适合进行扩展讨论。如果您有新问题,可以提出一个新问题

以上是关于带有 std::vectors 的图形?的主要内容,如果未能解决你的问题,请参考以下文章

包装 std::vector 的 std::vectors,C++ SWIG Python

两个 std::vectors 之间的匹配元素

具有预定义大小的 C++ std::vectors

将多个 std::vectors 复制到 1 的更好方法? (多线程)

使用密集和稀疏矩阵

C++ 类中的指针越来越乱