如何知道你输入std :: array的最后一个元素是什么?

时间:2012-12-19 18:04:35

标签: c++ stl

我正在制作一个mfc应用程序来制作一个有点绘图机制。使用折线,用户可以绘制图形,并且在按下回车键时,线的当前点将连接到起点[以形成闭合多边形]。我想你应该已经明白了。现在,我使用STL数组来存储多边形的每个顶点 - 用简单的单词,点击鼠标左键的每个点,同时绘制图形存储在数组中。

std::array<CPoint,11> v;   //vertices

我正在使用以下机制输出此数组的元素,即点:

  for(int j=0 ; j<v.size() ; j++ )
    {
        s.Format(L"%d %d\n",v[j].x, v[j].y);
        aDC.TextOutW(x+=20,y+=20,s );     //each time print the coordinates
        s=" ";                                    //at a different location
    }

在执行期间,当用户通过点击屏幕周围的点来绘制图形时,这些点存储在数组中。数组声明有12个元素,但很少有形状有12个顶点。元素的其余部分(空元素)保持(0,0) - 然而这些元素在循环中输出。所以我得到的是3-4坐标和许多(0,0)s。有没有办法只打印存储顶点的元素(我希望你明白我的意思)。像vertices[n]=/*some character that signifies the last element*/这样的东西。我的问题是,这个角色会是什么?比如字符串中的'\ 0'。

2 个答案:

答案 0 :(得分:2)

CPoint结构中的“结束标记”看起来不太合适:每对{x,y}代表一个法律点,至少在理论上是这样。

如果你坚持使用固定数组(大概是出于性能原因),你也可以将多边形顶点的数量存储在一个单独的变量中(继续你的字符串类比,那将是点的“Pascal字符串”,而不是而不是“C字符串”的点数。)

如果使用数组不是必需的,您可能需要切换到std::vector<CPoint>,这是一个更适合表示可变大小结构的容器,例如多边形。

最后,您可以将一个点指定为非法(例如,在{std::numeric_limits<long>::max(), std::numeric_limits<long>::max()}),静态创建该点的实例,并将其用作序列结束标记。在这种情况下,请考虑将数组扩展一个,并将结束标记用作标记。

答案 1 :(得分:0)

好吧,如果您打算将(0; 0)点视为无效,则只需检查点{0}}:

(0; 0)