c++ - 从 vector 中提取最小的复数

标签 c++ vector

vector 正在将点指向一个矩形。我希望能够获取最低和最高的复数并将其分配给 2 个不同的复数。我只尝试使用下面的最低值,但它似乎没有找到最低值,只返回第一个元素。

vector < complex<double>* > xs;
typedef typename vector < complex<double>* >::iterator Iter;
xs.push_back(&pointa); 
xs.push_back(&pointb); 
xs.push_back(&pointc); 
xs.push_back(&pointd); 

for (Iter p = xs.begin(); p != xs.end(); ++p)
{
   if((*p)->real()<(*p+1)->real() && (*p)->imag()<(*p+1)->imag())
   {
      double a = (*p)->real();
      double b = (*p)->imag();
      complex <double> botleft_1(a,b);
   }
   else
   {
   }
} 

有什么建议吗?

最佳答案

您代码中的直接错误是 *p+1表示 (*p)+1 .

修复后的下一个错误 *(p+1)将是你离开 vector 末尾的一个元素。您应该将每个值与迄今为止的最低/最高值进行比较,而不是与 vector 中的下一个值进行比较。

在任何情况下都没有“最低”或“最高”复数这样的东西 - 复数不是有序域(定理)。您可以在复数上定义任何您喜欢的比较运算符,但这将是相当随意的,例如它不一定具有有序的字段属性,例如 a < b && c < d => a+c < b+d。 .您定义的比较确实具有该属性,但不是严格的弱顺序,因此一旦您开始在 3 个或更多值之间进行比较,它的行为可能不会像您预期的那样。

例如,考虑值 complex<double> a(1,1), b(0,3), c(2,2); , 以及比较函数 lt(complex<double> lhs, complex<double> rhs) { return lhs.real() < rhs.real() && lhs.imag() < rhs.imag(); } .

然后lt(a,b)lt(b,a)都是假的。这意味着 ab就顺序而言是等效的。

同样,lt(b,c)lt(c,b)都是假的。这意味着 bc就顺序而言是等效的。

然而,lt(a,c)是真的。这意味着 ac就顺序而言,它们并不相同。

关于c++ - 从 vector 中提取最小的复数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8339473/

相关文章:

c++ - 可以使用 pop_back 从 vector 中删除某些值吗?

r - 总是选择向量的中间元素

c++ - DirectX:如果绑定(bind)索引缓冲区而不绑定(bind)顶点缓冲区会发生什么?

c++ - 与字符串文字的比较导致未指定的行为?

c++ - 在 C++ 中声明大小之前的数组分配中 * 是什么意思?

c++ - += 在没有 boost 的 vector 上

math - 从矢量中消除方向

java - 用java实现 vector 的程序

c++ - 如何在 C++ 中进行快速字符串连接

c++ - "MATLAB style"计算机视觉\图像处理可视化\调试工具