【问题标题】:Run function without duplicate无重复运行功能
【发布时间】:2021-03-01 16:00:31
【问题描述】:

我想知道是否有可能使函数运行不重复?

如果它通过带有数字1,2,2,3,4 的数组循环,我希望 2 只运行一次而不是两次。喜欢1,2,3,4。如何检查tab[i] 是否已插入?我需要在 c++ 98 中执行此操作。

     std::vector<int> noDup(n);

 for(int k=0; k < n; k++) {
    bool exists = false;

    for(int c= 0; c < noDup.size(); c++) {
      if(tab[k] == tab[c]) {
        exists = true;
        break;
      }
      if(exists == false) {
        noDup.push_back(tab[k]);
      }
    }
  }

  for(auto c : noDup) {
    cout << c << " ";
  }

当我在选项卡数组 4 中插入元素数量时, 我输入2,2,3,4 我得到输出0 0 0 0 3 3 4 4 4

【问题讨论】:

  • tab 是什么?请发帖minimal reproducible example
  • 如果可以比较 tab 的元素的顺序,std::set 可能会有所帮助。
  • @MikeCAT 不在 c++ 98 中。
  • @debooger3 std::set 在 C++98 中确实存在。如果您无法使用它,您可能应该找出确切原因,并将其包含在您的问题中。
  • 基本上可以对数组进行排序,并将每个元素与前一个元素进行比较...

标签: c++ c++98


【解决方案1】:

你做到了

      if(exists == false) {
        noDup.push_back(tab[k]);
      }

在错误的地方。它必须在检查所有元素之后。

此外,向量std::vector&lt;int&gt; noDup(n); 已经有n 元素,push_back() 将在初始n 元素之后添加元素。 看来您想预先分配而不通过reserve() 添加元素。

条件tab[k] == tab[c] 也是错误的。应该是tab[k] == noDup[c]

另一个错误是使用了 for(auto c : noDup)(基于范围的 for 和 auto),它在 C++11 中可用,在 C++98 中不可用。

固定代码:

std::vector<int> noDup;
noDup.reserve(n);

for(int k=0; k < n; k++) {
  bool exists = false;

  for(int c= 0; c < noDup.size(); c++) {
    if(tab[k] == noDup[c]) {
      exists = true;
      break;
    }
  }
  if(exists == false) {
    noDup.push_back(tab[k]);
  }
}

for(std::vector<int>::iterator it = noDup.begin(); it != noDup.end(); it++) {
  cout << *it << " ";
}

更好的选择是使用std::set

std::set<int> seen;
std::vector<int> noDup;
noDup.reserve(n);

for(int k=0; k < n; k++) {
  if (seen.find(tab[k]) == seen.end()) {
    seen.insert(tab[k]);
    noDup.push_back(tab[k]);
  }
}

for(std::vector<int>::iterator it = noDup.begin(); it != noDup.end(); it++) {
  cout << *it << " ";
}

【讨论】:

    猜你喜欢
    • 2011-08-21
    • 2016-04-20
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 2022-12-08
    • 2015-09-26
    • 2012-11-21
    相关资源
    最近更新 更多