2014-11-09 3 views
0

Мне нужно создать программу, которая просит пользователя ввести 20 чисел от 10 до 100, которые будут сохранены в векторе, но будут сохранены только уникальные значения. Я создал программу, которая хранит значения в пределах диапазона, но я не знаю, как хранить только уникальные значения. Вот что у меня есть:C++ Уникальные значения в векторе?

#include <iostream> 
#include <vector> 
using namespace std; 

void print(vector<int>v); 

int main() 
{ 
    vector<int>v; 


    int x; 
    for (int num = 0; num < 20; num++) 
    { 
     cout << "Enter number " << (num + 1) << ":"; 
     cin >> x; 
     if (10 < x) 
     { 
      if (x < 100) 

       v.push_back(x); 
     } 
    } 
    print(v); 


} 

void print(vector<int>v2) 
{ 
    for (int count = 0; count < v2.size(); count++) 
    cout << v2[count] << " "; 
} 

Я хочу поблагодарить всех за помощь.

+1

Почему ваша версия для печати скопировать весь вектор? В этом нет необходимости. Вместо этого передайте константу. –

+1

Если вектор необходимо использовать, используйте функцию 'std :: find', чтобы проверить, существует ли значение перед вставкой. –

+0

Почему бы вам просто не использовать std :: set? – paulm

ответ

0

Вы можете использовать std::set или std::unordered_set, чтобы отслеживать значения, которые вы уже видели. В частности, метод insert вернет, было ли значение уже вставлено в набор. Затем вы вводите значение только в вектор, если значение новое.

1

Мое решение, приведенное ниже, пытается как можно меньше изменить код (добавлено 4 строки). Я запустил это в командной строке.

Обратите внимание, что сразу после утверждения 'cin >> x' я добавил тест, чтобы определить, было ли введенное целое уже в векторе v. Если тест завершается успешно, то возможное добавление введенного целого к вектору заброшен, с аналогичным воздействием на то, что он находится вне пределов досягаемости.

Обратите внимание, что <algorithm> должен быть включен для использования.

Будучи просто небольшим ржавым, я сделал быстрый поиск в Интернете, используя 'C++ vector test membership' (без кавычек, конечно :-) в качестве поискового запроса.

Я предположил, что производительность еще не является приоритетной задачей, но если размер вектора был намного больше, чем 20, это могло бы стоить хеш (по-видимому, сопоставимы варианты <algorithm>), что дает больше лог-файла (n) чем линейное время поиска.

#include <iostream> 
#include <vector> 
#include <algorithm> 
using namespace std; 

void print(vector<int>v); 

int main() 
{ 
    vector<int>v; 


    int x; 
    for (int num = 0; num < 20; num++) 
    { 
     cout << "Enter number " << (num + 1) << ":"; 
     cin >> x; 
     if (find(v.begin(), v.end(), x) != v.end()) { 
      continue; 
     } 
     if (10 < x) 
     { 
      if (x < 100) 

       v.push_back(x); 
     } 
    } 
    print(v); 


} 

void print(vector<int>v2) 
{ 
    for (int count = 0; count < v2.size(); count++) 
    cout << v2[count] << " "; 
} 
1

Вы можете использовать std::unique:

http://www.cplusplus.com/reference/algorithm/unique/?kw=unique

using namespace std; 

vector<int> v; 
int x; 

for (int num = 0; num < 20; num++) 
{ 
    cout << "Enter number " << (num + 1) << ":"; 
    cin >> x; 
    if (10 < x) 
    { 
     if (x < 100) 

      v.push_back(x); 
    } 
} 

sort(v.begin(), v.end()); 
vector<int>::iterator it; 
it = unique(v.begin(), v.end()); 

v.resize(distance(v.begin(),it)); 
Смежные вопросы