将一个数组复制到另一个数组而不重复C ++

时间:2013-07-10 14:30:41

标签: c++

问题是,我有一个10个整数的数组,有一些重复。任务是将此数组复制到另一个大小相同但没有重复值的数组。也就是说,从array1读取一个元素,将它与array2中的所有元素进行比较,如果它已经在array2中,只需跳过它或打印它已经在array2中,转到array1的第二个元素,然后重复该过程。 现在,我试过这个,但不知道问题出在哪里:

#include <iostream>
using namespace std;

int main()
{
    int temp;

    int array1[] = {10,2,5,4,10,5,6,9,8,10};
    int array2[11] = {0};

    for(int i = 1; i <= 10; i++)
    {
            temp = array1[i-1];

            for(int j = 1; j <= 10; j++)
            {
                    if(temp == array2[j])
                    {
                            cout << "Duplicate " << temp << endl;
                            i++;
                            break;
                    }
            }

            array2[i] = array1[i-1];
    }

    for(int k = 1; k <= 10; k++)
            cout << array2[k] << "  " << endl;
system("pause");
}

7 个答案:

答案 0 :(得分:3)

array1有10个元素,array2有11个元素,因此无法满足要求。据推测,有11个元素是在for循环中使用不正确的索引值的解决方法;索引应该从0到9,而不是从1到10。

当您向第二个数组添加元素时,您应该只针对已添加的元素检查它的值,而不是针对整个数组中的值。

最后,还有一个不足之处。一旦消除了重复项,就会少于10个元素; array2有10个要素;额外元素应该具有什么值?

答案 1 :(得分:1)

std :: unique_copy是你的朋友: http://en.cppreference.com/w/cpp/algorithm/unique_copy

记得首先对源数组进行排序

答案 2 :(得分:0)

您有三种方法:

  • 逐个比较每个元素( O(N^2) 表现)
  • 对您的参考数组进行排序并使用二进制搜索来确定该元素是否存在( O(N*lnN) 性能)
  • 创建查找哈希( O(1) 表现)

答案 3 :(得分:0)

在C ++中,break立即结束一个循环结构,并在它之后立即开始执行。因此,行array2[i] = array1[i-1];无论内部for循环是否发现重复都执行。一种解决方案是设置一个变量,指示该值是重复的:

 int main() {
     int temp;
     bool isDuplicate; //added this line

     int array1[] = {10,2,5,4,10,5,6,9,8,10};
     int array2[11] = {0};

     for(int i = 1; i <= 10; i++)
     {
             temp = array1[i-1];
             isDuplicate=false;//added this line
             for(int j = 1; j <= 10; j++)
             {
                     if(temp == array2[j])
                     {
                             cout << "Duplicate " << temp << endl;
                             i++;
                             isDuplicate=true; //added this line
                             break;
                     }
             }
             if(!isDuplicate) //added this line
             array2[i] = array1[i-1];
     }

     for(int k = 1; k <= 10; k++)
             cout << array2[k] << "  " << endl; system("pause"); }

或者(尽管许多程序员不同意这种做法)你可以使用goto语句而不是break语句:

int main()
{
    int temp;

    int array1[] = {10,2,5,4,10,5,6,9,8,10};
    int array2[11] = {0};

    for(int i = 1; i <= 10; i++)
    {
            temp = array1[i-1];

            for(int j = 1; j <= 10; j++)
            {
                    if(temp == array2[j])
                    {
                            cout << "Duplicate " << temp << endl;
                            i++;
                            goto duplicate; //added this line
                    }
            }

            array2[i] = array1[i-1];
            //added next line
            duplicate:
    }

    for(int k = 1; k <= 10; k++)
            cout << array2[k] << "  " << endl;
system("pause");
}

答案 4 :(得分:0)

您可以使用std :: set来确保您的唯一性。

http://en.cppreference.com/w/cpp/container/set

答案 5 :(得分:0)

我可以在你的代码中看到两个主要的问题来源:1)break语句实际上没有解决在找到重复的情况和在array1中的元素之间区分的问题应该添加到array2。 2)没有计数器可以存储到目前为止插入到array2中的元素数量,这样它们就无法复制到彼此相邻的array2。修复两者的代码是:

#include <iostream>
using namespace std;

int main()
{

  int array1[] = {10,2,5,4,10,5,6,9,8,10};
  int array2[10];

  int array2_elements_inserted = 0; 

  for(int i = 0; i < 10; i++)
    {
      int temp = array1[i];

      bool isDuplicate = false; 
      for(int j = 0; j < array2_elements_inserted; j++)
        {
          if(temp == array2[j])
            {
              cout << "Duplicate " << temp << endl;
              isDuplicate = true; 
              break;
            }
        }

      if (!isDuplicate)
        {
          array2[array2_elements_inserted] = temp;
          ++array2_elements_inserted; 
        }
    }

    for(int k = 0; k < array2_elements_inserted; k++)
        cout << array2[k] << "  " << endl;
  //  system("pause");
}

输出:

10  
2  
5  
4  
6  
9  
8  

答案 6 :(得分:0)

首先,使用动态容器。特别是看看那些提供的 标准库,例如std::vector。其次,您应该使用set数据结构 跟踪您之前看到的元素,例如std::set

然后它只是对输入数组的迭代,并将新元素附加到 输出数组。

以下是一个例子:

#include <vector>
#include <set>
#include <iostream>

int main() {
    // define and print input data
    std::vector<int> v1 = {10,2,5,4,10,5,6,9,8,10};
    for (int i : v1) 
        std::cout << i << " ";
    std::cout << "\n";
    // this will soon contain the output data
    std::vector<int> v2;
    // a set to keep track of the already seen elements 
    std::set<int> set;
    // iterate the input array using range-based for loop
    for (int i : v1) {
        // check for duplicates
        if (set.find(i) == set.end()) {
            // first occurrence, insert to set, append to output data
            set.insert(i);
            v2.push_back(i);
        }
        else {
            // seen before, do nothing
        }
    }
    // print output data
    for (int i : v2) 
        std::cout << i << " ";
    std::cout << "\n";    
}

输出:

$ g++ test.cc -std=c++11 && ./a.out
10 2 5 4 10 5 6 9 8 10 
10 2 5 4 6 9 8 

供参考: