Форум программистов, компьютерный форум CyberForum.ru

Найти все повторяющиеся элементы вектора - C++

Восстановить пароль Регистрация
 
АннаОлоло
0 / 0 / 0
Регистрация: 08.11.2013
Сообщений: 6
08.11.2013, 04:35     Найти все повторяющиеся элементы вектора #1
Создать программу, которая вводит c клавиатуры (с обработкой ошибок) массив целых чисел, находит в нем все повторяющиеся последовательности
(1 1, 2 2 и т.д.) и заменяет каждую из них на два элемента: повторяющееся число и длину последовательности. Выдать результирующую последовательность и пары "длина - число последовательностей данной длины"
Пример:
вход: 1 1 1 2 2 2 2 3 4 4 4 5 5 5
выход: 1 3 2 4 3 4 3 5 3

не знаю как посчитать и записать в вектор((

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include<iostream>
#include<vector>
#include <time.h>
#include <iomanip>
#include <algorithm>           
using namespace std;
int main()
{
    //vector<int> v;
    int n;
    cout<<"vvedite razmernost = ";
    cin>>n;
    vector<int> v(n);
    int elem;
    cout<<"vvedite massiv: "<<endl;
    for (int i=0; i<n; i++) {
    cin >> elem;
        v.push_back(elem);   
    }
    //int *count=0;
    for(int i=0;i<n;i++)
    {
        if(v[i]=v[i+1]){
            int m=count(v.begin(), v.end(),v[i]);
            cout<<"vi= "<<v[i]<<' '<<"kolvo= "<<m<<endl;}}
 
    //int max_from_vector = *max_element(v.begin(), v.end());
    //cout<<"max= "<<max_from_vector<<endl;
    int count=0;
    for(int i=0;i<n;++i)
    {
        if(v[i]=v[i+1])
            ++count;
        //cout<<"v[i]"<<v[i]<<' '<<"count="<<count<<endl;
    
    vector<int> v2(count);
    for(int j=0;j<count;++j)
        cout<<v2[j];}
    
    system ("PAUSE");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.11.2013, 04:35     Найти все повторяющиеся элементы вектора
Посмотрите здесь:

C++ Дан одномерный массив, элементы которого - целые числа. Удалите из него все повторяющиеся элементы, оставив только их первые вхождения.
Дан список, элементы которого являются координатами вектора. Найти длину вектора C++
C++ Массив: Удалить все повторяющиеся элементы, оставив в массиве только один.
C++ Дан одномерный массив элементов. Необходимо вывести все не повторяющиеся элементы
Исключить из массива все повторяющиеся элементы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
08.11.2013, 09:20     Найти все повторяющиеся элементы вектора #2
В вашем случае лучше воспользоваться множеством, а не вектором.
Реализовал для вашего массива. Безопастный ввод смотрите здесь.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>
#include<set>
#include<map>
using std::cout;
using std::endl;
using std::multiset;
using std::map;
void fill(multiset<int>&);
int main(int argc, char* argv[])
{
    /**
     *  Мультимножество для входного массива
     */
    multiset<int> input;
    /**
     *  Результирующие отображение. Структура (число, кол-во вхождений)
     */
    map<int, int> output;
    /**
     *  Заполняем исходное множество. 
     */
    fill(input);
 
    /**
     *  Задаем начальные значения итераторов
     */
    multiset<int>::iterator posLow = input.begin();
    multiset<int>::iterator posUp  = input.begin();
 
    /**
     *  Ищем первый элемент который не равен предыдущему
     *  Заносим в отображение значение текущего элемента и кол-во его вхождений
     *  Переносим итератор на следующий элемент
     */
    while(posLow != input.end())
    {
        posUp = input.upper_bound(*posLow);
        output.insert(std::pair<int, int> (*posLow, distance(posLow, posUp)));
        posLow = posUp;
    }
 
    /**
     *  Вывод результата
     */
    map<int, int>::iterator out = output.begin();
    while(out != output.end())
    {
        cout << out->first << ' ' << out->second << ' ';
        ++out;
    }
    cout << endl;
 
    return 0;
}
void fill(multiset<int>& muset)
{
    muset.insert(1);
    muset.insert(1);
    muset.insert(1);
    muset.insert(2);
    muset.insert(2);
    muset.insert(2);
    muset.insert(2);
    muset.insert(3);
    muset.insert(4);
    muset.insert(4);
    muset.insert(4);
    muset.insert(5);
    muset.insert(5);
    muset.insert(5);
}
mat_for_c
 Аватар для mat_for_c
115 / 110 / 19
Регистрация: 26.04.2013
Сообщений: 585
Завершенные тесты: 2
08.11.2013, 11:02     Найти все повторяющиеся элементы вектора #3
Ilot, если я не ошибаюсь, то в map хранятся уникальные значения ключей, и тогда если в последовательности окажется 1 1 1 2 2 1 1 1 1, то ответ получится неверный , т.е. все же лучше юзать vector
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
08.11.2013, 11:41     Найти все повторяющиеся элементы вектора #4
Цитата Сообщение от mat_for_c Посмотреть сообщение
Ilot, если я не ошибаюсь, то в map хранятся уникальные значения ключей, и тогда если в последовательности окажется 1 1 1 2 2 1 1 1 1, то ответ получится неверный , т.е. все же лучше юзать vector
Не map, а multiset. это во первых. Во-вторых, структура их такова, что они изначально упорядочены в каком бы порядке вы не добавляли новый элемент в множество.
И последнее. Измените ф-ю fill для той последовательности какую предложили и посмотрите, что выведет программа.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11817 / 6796 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
08.11.2013, 12:29     Найти все повторяющиеся элементы вектора #5
Цитата Сообщение от Ilot Посмотреть сообщение
Во-вторых, структура их такова, что они изначально упорядочены в каком бы порядке вы не добавляли новый элемент в множество.
А где в задании говориться о упорядочении?
Цитата Сообщение от Ilot Посмотреть сообщение
Измените ф-ю fill для той последовательности какую предложили и посмотрите, что выведет программа.
неправильный ответ она выведет!
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
08.11.2013, 12:44     Найти все повторяющиеся элементы вектора #6
Цитата Сообщение от Croessmah Посмотреть сообщение
А где в задании говориться о упорядочении?
Нигде.
Цитата Сообщение от Croessmah Посмотреть сообщение
неправильный ответ она выведет!
А у меня правильный.
Croessmah, мне тяжело с вами дискутировать, но мне кажется вы что-то путаете.
Во-первых, я предложил использвать множество вместо вектора, а оно как известно опорядоченно и поэтому нет необходиости в дополнительной сортировке. А данные могут вводится в произвольном порядке.
Во-вторых приведите пример когда мой код не сработает. Мне самому интересно.
Миниатюры
Найти все повторяющиеся элементы вектора  
mat_for_c
 Аватар для mat_for_c
115 / 110 / 19
Регистрация: 26.04.2013
Сообщений: 585
Завершенные тесты: 2
08.11.2013, 12:56     Найти все повторяющиеся элементы вектора #7
Ilot,
Цитата Сообщение от АннаОлоло Посмотреть сообщение
находит в нем все повторяющиеся последовательности
на последовательность 1 1 1 2 1 1 1 у вас должно получиться 1 3 2 1 3, а не 1 6 2, т.к. здесь нет последовательности 1 1 1 1 1 1
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11817 / 6796 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
08.11.2013, 12:59     Найти все повторяющиеся элементы вектора #8
Цитата Сообщение от Ilot Посмотреть сообщение
А у меня правильный.
Croessmah, мне тяжело с вами дискутировать, но мне кажется вы что-то путаете.
В каком месте он правильный?
Должен быть 1 3 2 2 1 4 при таких данных, как на скрине

Добавлено через 1 минуту
Цитата Сообщение от Ilot Посмотреть сообщение
поэтому нет необходиости в дополнительной сортировке.
В этом нет необходимости и в самой задаче.

Добавлено через 52 секунды
Цитата Сообщение от Ilot Посмотреть сообщение
А данные могут вводится в произвольном порядке.
Вы просто не верно поняли задание.
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
08.11.2013, 13:19     Найти все повторяющиеся элементы вектора #9
Цитата Сообщение от Croessmah Посмотреть сообщение
Вы просто не верно поняли задание.
Ааа... мои извенения. Это действительно так.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
08.11.2013, 13:36     Найти все повторяющиеся элементы вектора #10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
 
void print(const std::unordered_map<int, int>& m)
{
   for (auto p : m) std::cout << p.first << " " << p.second << std::endl;
}
 
int main()
{
   std::vector<int> v {1,1,1,2,2,2,2,3,4,4,4,5,5,5};
   std::unordered_map<int, int> map;
 
   std::for_each(v.rbegin(), v.rend(), [&map](int val){ ++map[val]; });
   //print(map);
 
   v.clear();
   std::for_each(map.begin(), map.end(), [&v](const std::pair<int, int>& p)
   {
      if (p.second > 1)
      {
         v.push_back(p.first);
         v.push_back(p.second);
      }
      else
         v.push_back(p.first);
   });
 
   for (int i : v) std::cout << i << " ";
 
   std::cout << "\n\nDone." << std::endl;
   return 0;
}
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
08.11.2013, 13:38     Найти все повторяющиеся элементы вектора #11
Так не сойдёт?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
 
 
int main() {
   int previous;
   std::cin >> previous;
   
   std::size_t count = 1;
   
   for (int current; std::cin >> current; ) {
      if (current == previous) {
         ++count;
      } else {
         std::cout << previous << ' ';
        
         previous = current;
         
         if (count != 1) {
            std::cout << count << ' ';
            count = 1;
         }
      }
   }
   
   std::cout << previous;
   
   if (count != 1) {
       std::cout << ' ' << count;
   }
   
   std::cout << std::endl;
}
Добавлено через 28 секунд
http://ideone.com/cyc9lY
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
08.11.2013, 13:41     Найти все повторяющиеся элементы вектора #12
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <vector>
#include <algorithm>
 
int main()
{
   std::vector<int> v = {1,1,1,2,2,3,4,4,4,4,1,1,3};
   std::vector<std::pair<int, int>> results;
   int prev = v[0];
   int counter = 0;
   for (int value : v)
   {
      if (prev != value)
      {
         results.emplace_back(prev, counter);
         prev = value;
         counter = 0;
      }
      ++counter;
   }
   if (counter)
   {
      results.emplace_back(prev, counter);
   }
   for (const auto& p : results)
   {
      if (p.second == 1)
      {
         std::cout << p.first << " ";
      }
      else
      {
         std::cout << p.first << " " << p.second << " ";
      }
   }
   std::cout << std::endl;
}
Добавлено через 1 минуту
DiffEreD, Аналогично неверно понято задание. Что выдаст ваш пример на последовательности
1,1,1,2,2,3,4,4,4,4,1,1,3?
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
08.11.2013, 13:58     Найти все повторяющиеся элементы вектора #13
Вот теперь надеюсь правильно, хотя может быть уже не так красиво:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include<vector>
#include<map>
using std::cout;
using std::endl;
using std::vector;
using std::pair;
void fill(vector<int>&);
int main(int argc, char* argv[])
{
    vector<int> input;
    vector<pair<int, int> > output;
 
    fill(input);
 
    int posLow = 0;
    int posUp  = 0;
 
    while(posLow < input.size())
    {
        while ((input[posUp] == input[posLow])
        && (posUp < input.size()))
            ++posUp;
        output.push_back(pair<int, int> (input[posLow], posUp - posLow + 1));
        posLow = ++posUp;
    }
 
    int out = 0;
    while(out < output.size())
    {
        cout << output[out].first << ' ' << output[out].second << ' ';
        ++out;
    }
    cout << endl;
 
    return 0;
}
void fill(vector<int>& muset)
{
    muset.push_back(1);
    muset.push_back(1);
    muset.push_back(1);
    muset.push_back(2);
    muset.push_back(2);
    muset.push_back(1);
    muset.push_back(1);
    muset.push_back(1);
 
}


Добавлено через 8 минут
Подправил код...
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
08.11.2013, 14:26     Найти все повторяющиеся элементы вектора #14
Алгоритмизма ради.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>
#include <functional>
 
template<typename Iterator, typename Compare = std::equal_to<typename std::iterator_traits<Iterator>::value_type>>
std::pair<Iterator, Iterator> find_next_sequence(Iterator first, Iterator last, Compare cmp = Compare())
{
   Iterator current = first;
   while (current != last)
   {
      Iterator next = std::next(current);
      if (next == last || *current != *next)
      {
         break;
      }
      ++current;
   }
   return std::make_pair(first, std::next(current));
}
 
int main()
{
   std::vector<int> v = {1,1,1,2,2,3,4,4,4,4,1,1,3};
   std::vector<std::pair<int, int>> result;
   for (auto pos = v.begin(); pos != v.end();)
   {
      auto range = find_next_sequence(pos, v.end());
      result.emplace_back(*range.first, std::distance(range.first, range.second));
      pos = range.second;
   }
   for (const auto& p : result)
   {
      if (p.second == 1)
      {
         std::cout << p.first << " ";
      }
      else
      {
         std::cout << p.first << " " << p.second << " ";
      }
   }
   std::cout << std::endl;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.11.2013, 16:47     Найти все повторяющиеся элементы вектора
Еще ссылки по теме:

C++ Найти повторяющиеся в массиве элементы
C++ Преобразовать массив, удалив из него все повторяющиеся элементы
C++ Удалить все повторяющиеся элементы в векторе

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
08.11.2013, 16:47     Найти все повторяющиеся элементы вектора #15
Мое красивое решение (надеюсь последнее):
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include<vector>
#include<algorithm>
using std::cout;
using std::endl;
using std::vector;
using std::pair;
void fill(vector<int>&);
int main(int argc, char* argv[])
{
    vector<int> input;
    vector<pair<int, int> > output;
 
    fill(input);
    vector<int>::iterator posLow = input.begin();
    vector<int>::iterator posUp = input.begin();
 
    while(posLow != input.end())
    {
        posUp = std::find_if(posLow, input.end(), std::bind2nd(std::not_equal_to<int>(),*posLow));
        output.push_back(pair<int, int> (*posLow, posUp - posLow));
        posLow = posUp;
    }
 
    vector<pair<int, int> >::iterator out = output.begin();
    while(out != output.end())
    {
        cout << out->first << ' ' << out->second << ' ';
        ++out;
    }
    cout << endl;
 
    return 0;
}
void fill(vector<int>& muset)
{
    muset.push_back(1);
    muset.push_back(1);
    muset.push_back(1);
    muset.push_back(2);
    muset.push_back(2);
    muset.push_back(1);
    muset.push_back(1);
    muset.push_back(1);
 
}
Yandex
Объявления
08.11.2013, 16:47     Найти все повторяющиеся элементы вектора
Ответ Создать тему
Опции темы

Текущее время: 03:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru