【问题标题】:Dereference pointer to array of long from list iterator从列表迭代器中取消引用指向 long 数组的指针
【发布时间】:2018-12-11 16:09:38
【问题描述】:

如何正确取消引用指向 long 数组的指针。
在函数main 中,我的代码似乎打印的是地址而不是长值。

#include <list>
#include <iostream>
#include <cmath>
#include <vector>

bool
is_prime (long i)
{
    // fix wrong return values for 0 and 1
    if (i <= 1)
        return false;

    const long j = (long) std::sqrt(i);

    for (long k=2; k<j+1; ++k) {
        if (i % k == 0)
            return false;
    }

    return true;
}

std::list<long(*)[2]>
goldbach (long number)
{
    std::list<long(*)[2]> sums;
    std::list<long(*)[2]>::iterator it;

    if (number < 4)  // Exclude too small integers.
        return sums;

    if (number % 2)  // Exclude uneven numbers.
        return sums;

    it = sums.begin();

    for (long candidate=2; candidate < number; ++candidate)
    {
        if (is_prime(candidate))
        {
            if (is_prime(number - candidate))
            {
                long sum[2];
                sum[0] = candidate;
                sum[1] = number - candidate;
                std::cout << sum[0] << " + " << sum[1] << "\n";
                sums.insert(it, &sum);
                ++it;
            }
        }
    }

    return sums;
}

int
main ()
{
    std::list<long(*)[2]> sums;
    std::list<long(*)[2]>::iterator it;

    for(long i = 4; i < 100; i+=2)
    {
        std::cout << "### " << i << " ###" << "\n";
        sums = goldbach(i);

        for (it = sums.begin(); it != sums.end(); ++it)
        {
            long num1 = *((*it)[0]);
            long num2 = *((*it)[1]);
            std::cout << num1  << " + "  << num2 << "\n";
        }

        std::cout << "\n\n";
    }
}

【问题讨论】:

  • sums.insert(it, &amp;sum); 存储了一个指向循环局部变量的指针 - 在迭代结束后它变得悬空
  • 指向数组的指针列表?你确定这种邪恶的数据结构真的有必要吗?
  • 让 C++ 成为 C++。不是 C。
  • 谢谢大家。我会重新考虑我的方法。
  • @RichardNeumann 也许std::list&lt;long(*)[2]&gt; sums; -- 也许std::list&lt;std::pair&lt;long,long&gt;&gt; sums?

标签: c++ arrays list pointers


【解决方案1】:

感谢 cmets,我意识到列表中的数组在 C++ 中是个坏主意。
我将代码更改为以下代码:

#include <list>
#include <iostream>
#include <cmath>
#include <vector>

bool
is_prime (long i)
{
    // fix wrong return values for 0 and 1
    if (i <= 1)
        return false;

    const long j = (long) std::sqrt(i);

    for (long k=2; k<j+1; ++k) {
        if (i % k == 0)
            return false;
    }

    return true;
}

std::list<std::pair<long, long>>
goldbach (long number)
{
    std::list<std::pair<long, long>> sums;
    std::list<std::pair<long, long>>::iterator it;

    if (number < 4)  // Exclude too small integers.
        return sums;

    if (number % 2)  // Exclude uneven numbers.
        return sums;

    it = sums.begin();
    long complement;

    for (long candidate=2; candidate < number; ++candidate)
    {
        if (is_prime(candidate))
        {
            complement = number - candidate;

            if (is_prime(complement))
            {
                std::pair<long, long> sum = std::make_pair(candidate, complement);
                sums.insert(it, sum);
                ++it;
            }
        }
    }

    return sums;
}

int
main ()
{
    std::list<std::pair<long, long>> sums;
    std::list<std::pair<long, long>>::iterator it;

    for(long i = 4; i < 100; i+=2)
    {
        std::cout << "### " << i << " ###" << "\n";
        sums = goldbach(i);

        for (it = sums.begin(); it != sums.end(); ++it)
        {
            std::cout << it->first  << " + "  << it->second << "\n";
        }

        std::cout << "\n\n";
    }
}

【讨论】:

  • 这看起来好多了。看来您只是在最后插入,请考虑改用向量,那里不需要迭代器。另外,range-based for loopsfor(auto &amp;v : sums) { v.first; v.second; }
猜你喜欢
  • 2019-01-24
  • 1970-01-01
  • 2012-03-25
  • 2021-12-30
  • 2011-10-20
  • 1970-01-01
  • 2012-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多