如何编写可以访问向量<Vec2s>内 Vec2s 任何元素的函数

How do I write a function that can access any element of a Vec2s inside of a vector<Vec2s>

本文关键字:Vec2s gt 任何 函数 元素 lt 何编写 访问 向量      更新时间:2023-10-16

我希望有人能告诉我如何编写一个函数,可以访问任何Vec*的任何元素,例如Vec2s*, Vec2b*,在vector_Vec2s*内。vector_Vec2s*是vector<Vec2s>.

的类型定义

这是我到目前为止的尝试(我仍在学习),所以如果vector_Vec2s*中的第一个Vec2s有元素[1,2],我希望能够返回1或2

 short std_vector_get_element( vector_Vec2s* v, int i ) {
 vector_Vec2s v = *v; 
 int a = v[i];
 return a;
 }

如果vector_Vec2s是向量的向量,那么你应该告诉你的函数(或宏)元素的索引,你想得到哪个向量。正如我看到的,函数应该是这样的:

short std_vector_get_element( vector_Vec2s * v
                            , unsigned int vectorIdx
                            , unsigned int elementIdx ) {
    return (*v)[ vectorIdx ][ elementIdx ];
}

或宏观

#define std_vector_get_element( v, vectorIdx, elementIdx ) 
    (*v)[ vectorIdx ][ elementIdx ]

或者像这样更好

template< class T >
T std_vector_get_element( const std::vector< std::vector< T > > & v
                        , unsigned int vectorIdx
                        , unsigned int elementIdx ) {
    return v[ vectorIdx ][ elementIdx ];
}

但是在这种情况下,我看不出有什么理由使用这个函数而不是这样写:

short elem = v[ vectorIdx ][ elementIdx ]; // I think this is better then the next
//short elem = std_vector_get_element( v, vectorIdx, elementIdx );

让我们检查一下你的代码:

 short std_vector_get_element( vector_Vec2s* v, int i ) {
 vector_Vec2s v = *v; 
 int a = v[i];
 return a;
 }
  • 结果类型short:
    当没有很好的理由使用其他东西时,只使用int。请记住,过早优化是万恶之源。

  • 名称std_vector_get_element与类型指示:
    在c++中,函数可以并且经常在参数类型上重载。大多数情况下,不需要在名称中指示参数类型。另一方面,指示结果类型通常是一个好主意。还要注意,operator()是成员函数的有效名称,并且支持非常自然的索引表示法。由std::vector建立的字母名称的一个惯例是称其为at, item也不是一个坏名字。

  • 参数类型vector_Vec2s *:
    首先形式参数应该是const,这样函数才能用于const的实际参数。其次,参数类型应该是引用,而不是指针,例如,为了能够将函数结果直接作为实际参数传递,并避免指针是否为0的不确定性。所以,使用参数类型vector_Vec2s const&

  • 索引的参数类型为int:
    这通常是可以的,但如果您想要在64位平台上支持>4G项目,则不是这样。在这种情况下,使用<stddef.h>中的ptrdiff_t,这也是一个有符号类型(它是指针差异的类型)。

  • 复制vector_Vec2s v = *v;:

对于原始代码,我们减少到& help;

 int item( int const i, vector_Vec2s const& v )
 {
     return v[i];
 }

希望这将帮助您完成如何编写一个可以访问任何Vec*的任何元素的函数的任务,我发现这有点太不清楚了。