【问题标题】:subtract consecutive set elements减去连续的集合元素
【发布时间】:2018-04-25 09:01:30
【问题描述】:

我正在尝试实现solLoops 函数的集合版本:

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <ctime>
#include <vector>
#include <algorithm>
#include <unordered_set>

int solLoops(std::vector<int> A)
{

    int count = 0;
    for (int i = 0; i < A.size() - 1; ++i)
    {
        if (A[i + 1] - A[i] <= 1)
        {
            count++;
        }
    }
    return count;
}

int solSet(std::vector<int> A)
{
    std::unordered_set<int> S;

    for (int i = 0; i  < A.size(); ++i)
    {
        S.insert(A[i]);
    }

    int count = 0;
    for (auto it = S.begin(); it != std::prev(S.end()); ++it)
    {
        auto it2 = std::next(it, 1);
        if (*it2 - *it <= 1)
        {   
            count++;
        }
    }

    return count;
}



int main() {

    const unsigned int N = 4;

    std::vector<int> A;
    A.reserve(N);
    A.emplace_back(11);
    A.emplace_back(12);
    A.emplace_back(13);
    A.emplace_back(1);
    A.emplace_back(2);

    //int result = solLoops(A);
    int result = solSet(A);
    std::cout << "Result is: " << result << "\n";
    std::cout << "\n";

    return 0;
}

但我遇到了段错误。 我正在尝试实现循环:

for (int i = 0; i &lt; A.size() - 1; ++i)

for (auto it = S.begin(); it != std::prev(S.end()); ++it)

然后做减法:

if (A[i + 1] - A[i] &lt;= 1)

作为

auto it2 = std::next(it, 1); if (*it2 - *it <= 1)

(我知道集合包含随机顺序的元素。我只是想弄清楚如何在这里做减法)

【问题讨论】:

  • 为什么不直接使用非无序std::set,它确实有双向迭代器?
  • unordered_set 有前向迭代器。这意味着std::prev(S.end()) 不合适。

标签: c++ iterator unordered-set


【解决方案1】:

std::unordered_setforward iterators(只能前进)。但是std::prev 需要bidirectional iterator

您可以通过检查 next 迭代器是否结束来解决您的问题:std::next(it) != S.end()。或者改用std::set,它个双向迭代器。

【讨论】:

  • 好的,我错过了,谢谢。我现在正在使用 set,但结果与简单循环版本不同。结果是 3 与 set 版本和 4 与循环。我错过了什么?
  • @George 你可能想learn how to debug your program。要么添加大量“调试打印”,要么在调试器中逐行执行代码。
  • 好的,我忘了 set 对元素进行排序,现在好了。
猜你喜欢
  • 2021-05-04
  • 1970-01-01
  • 2019-01-08
  • 2014-07-08
  • 2019-01-22
  • 2018-08-11
  • 1970-01-01
  • 2011-07-27
  • 1970-01-01
相关资源
最近更新 更多