【问题标题】:Extracting lowest complex number from a vector从向量中提取最小复数
【发布时间】:2011-12-01 10:03:02
【问题描述】:

向量将点指向一个矩形。我希望能够取最低和最高的复数并将其分配给 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
   {
   }
} 

有什么建议吗?

【问题讨论】:

  • 格式化你的代码怎么样?
  • 我认为您需要澄清“最低复数”的含义。您希望如何比较两个复数? |你|
  • 为了在数学上正确,没有最低复数之类的东西(它们没有可比性)。你到底在找什么?也许您想要的是模数最低的数字?

标签: c++ vector


【解决方案1】:

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

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

在任何情况下都没有“最低”或“最高”复数之类的东西 - 复数不是有序域(定理)。您可以在复数上定义任何您喜欢的比较运算符,但它会非常随意,例如它不一定具有诸如a &lt; b &amp;&amp; c &lt; d =&gt; a+c &lt; b+d 之类的有序字段属性。您定义的比较确实具有该属性,但不是严格的弱顺序,因此一旦您开始在 3 个或更多值之间进行比较,它可能不会按照您预期的方式运行。

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

那么lt(a,b)lt(b,a) 都是假的。这意味着ab 就顺序而言是等价的。

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

但是,lt(a,c) 是真的。这意味着ac 就顺序而言并不等同。

【讨论】:

    【解决方案2】:

    在循环中,您不会与最小的数字进行比较,而只会与下一个数字进行比较。试试这样的:

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

    循环之后,变量lowest 将是您想要的变量。

    此外,在您的循环版本中,您将与 p + 1 进行比较,最后一项将是 xs.end(),这将不是一个有效的指针。

    【讨论】:

      【解决方案3】:

      使用boost::minmax_element

      std::pair< Iter > pairit = boost::minmax_element( xs.begin(), xs.end(), 
          [&]( complex<double>* pcomplexA, complex<double>* pcomplexB ) {
               //  Suitable comparison predicate (see Steve Jessop's answer)
               return pcomplexA->abs() < pcomplexB->abs(); // |a| < |b|
          });
      

      【讨论】:

        猜你喜欢
        • 2022-11-03
        • 2010-09-30
        • 1970-01-01
        • 2019-10-20
        • 2017-02-10
        • 2015-11-01
        • 2018-04-08
        • 2018-09-21
        • 1970-01-01
        相关资源
        最近更新 更多