运行 没有重复的函数

Run function without duplicate

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

如果它循环遍历带有数字 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

你做到了

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

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

向量 std::vector<int> 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 << " ";
}