我想从特定的c ++数组输出唯一的项目

时间:2012-03-09 16:34:04

标签: c++ arrays

我创建了一个计算数组中重复项的函数 一切都很好。但我只想输出独特的物品,这是我的问题。

我的功能:

void RepeatedCounter(int n){
    int i, j, temp, count= 0;
    int *Numbers = new int[n];
    for(i=0;i<n;i++){
        cout << "Enter the number (" << i+1 << "): "; 
        cin >> *(Numbers+i);
    }
    cout << "---------------------\n";
    for(i=0;i<n;i++){
        temp = *(Numbers+i);
        for(j=0;j<n;j++){
            if(temp == *(Numbers+j)){
                ++count;
            }
        }
        if(*(Numbers+i+1) != temp)
        cout << *(Numbers+i) << "= " << count << endl;
        count= 0;
    }

    delete []Numbers;
}

主要功能:

int Num_Of_Digits= 0;
cout << "How many numbers: ";
cin >> Num_Of_Digits;
RepeatedCounter(Num_Of_Digits);

示例:

Inputs  
1  
5  
3  
5  
1  

错误的结果(当前输出)

1= 2   
5= 2  
3= 1  
5= 2   
1= 2  

我想要什么

1= 2     
5= 2  
3= 1  

4 个答案:

答案 0 :(得分:4)

这已经为你完成了。

#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>  

int repeated_counter(int n){
    std::vector<int> vec;
    std::vector<int> uniques;
    int t;
    for(int i=0; i!=n; ++i)
    {   
        std::cin >> t;
        vec.push_back(t);
    }
    std::sort(vec.begin(), vec.end());
    std::unique_copy(vec.begin(), vec.end(), 
                     std::back_inserter(uniques));

    for(std::vector<int>::iterator it=uniques.begin(); 
        it!=uniques.end(); 
        ++it)
    {
        std::cout << *it << "=" 
            << std::count(vec.begin(), vec.end(), *it) << "\n";
    }
    return 0;
} 

请不要使用new记忆,就像你已经做到的那样,使用矢量会更糟糕。

http://www.sgi.com/tech/stl/unique_copy.html

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

答案 1 :(得分:4)

首先:将用户数据读入适当的动态容器,如vector

std::vector<int> v;
v.reserve(100);

while (true)
{
    int n;
    std::cout << "Enter the number: ";
    if (!(std::cin >> n)) { break; }
    v.push_back(n);
}

其次,使用map

制作直方图
std::map<int, unsigned int> histogram;
for (int i : v) { ++histogram[i]; }

现在输出计数:

for (auto const & p : histogram)
{
    std::cout << "The number " << p->first
              << " appears " << p->second << " times.\n";
}

答案 2 :(得分:1)

试试这个,

for(i=0;i<n;i++){
    count= 0;
    temp = *(Numbers+i);
    bool found = false;
    for(j=0;j<n;j++){
        if(temp == *(Numbers+j)){
            ++count;
        }
    }
    for(j=i+1;j<n;j++) {
        if(temp == *(Numbers+j)){
            found = true;
        }
    }
    if(found) continue;
    if(*(Numbers+i+1) != temp)
    cout << *(Numbers+i) << "= " << count << endl;
}

答案 3 :(得分:-1)

问题是你只是检查列表中的下一个号码。

    if(*(Numbers+i+1) != temp)
    cout << *(Numbers+i) << "= " << count << endl;

你应该做的是在列表的前面循环(直到你到达你所在的号码)并检查这些号码中的任何一个是否与你当前的号码相同,并且如果它们不是打印出来的话“T。您也可以在开始计数之前检查该数字,如果已经完成了数字,则不要这样做。