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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
АннаОлоло
0 / 0 / 0
Регистрация: 08.11.2013
Сообщений: 6
#1

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

08.11.2013, 04:35. Просмотров 798. Ответов 14
Метки нет (Все метки)

Создать программу, которая вводит 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++
Дан массив. Допустим я ввожу элементы 1,2,3,2,4 И нужно создать новый массив чтобы одинаковых элементов в нем не было, то есть чтобы мне...

Все повторяющиеся элементы переставить в самое начало - C++
Все повторяющиеся элементы переставить в самое начало.Вот мой код.Не могу понять почему не правильно работает,вроде бы все должно работать....

Преобразовать массив, удалив из него все повторяющиеся элементы - C++
Дан целочисленный массив, содержащий n элементов. Преобразовать массив, удалив из него все повторяющиеся элементы.

Исключить все повторяющиеся, идущие подряд элементы дека - C++
Создать список из целых чисел. Подсчитать количество пар соседних элементов, которые совпадают между собой. Оставить по одному из таких...

Массив: Удалить все повторяющиеся элементы, оставив в массиве только один. - C++
Помогите, народ! Срочно нужна программа. Собственно задание: В целочисленном массиве k(n), заданном случайным образом, много...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ilot
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 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
139 / 134 / 29
Регистрация: 26.04.2013
Сообщений: 649
Завершенные тесты: 2
08.11.2013, 11:02     Найти все повторяющиеся элементы вектора #3
Ilot, если я не ошибаюсь, то в map хранятся уникальные значения ключей, и тогда если в последовательности окажется 1 1 1 2 2 1 1 1 1, то ответ получится неверный , т.е. все же лучше юзать vector
Ilot
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 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
Модератор
Эксперт CЭксперт С++
13052 / 7315 / 814
Регистрация: 27.09.2012
Сообщений: 18,052
Записей в блоге: 3
Завершенные тесты: 1
08.11.2013, 12:29     Найти все повторяющиеся элементы вектора #5
Цитата Сообщение от Ilot Посмотреть сообщение
Во-вторых, структура их такова, что они изначально упорядочены в каком бы порядке вы не добавляли новый элемент в множество.
А где в задании говориться о упорядочении?
Цитата Сообщение от Ilot Посмотреть сообщение
Измените ф-ю fill для той последовательности какую предложили и посмотрите, что выведет программа.
неправильный ответ она выведет!
Ilot
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
08.11.2013, 12:44     Найти все повторяющиеся элементы вектора #6
Цитата Сообщение от Croessmah Посмотреть сообщение
А где в задании говориться о упорядочении?
Нигде.
Цитата Сообщение от Croessmah Посмотреть сообщение
неправильный ответ она выведет!
А у меня правильный.
Croessmah, мне тяжело с вами дискутировать, но мне кажется вы что-то путаете.
Во-первых, я предложил использвать множество вместо вектора, а оно как известно опорядоченно и поэтому нет необходиости в дополнительной сортировке. А данные могут вводится в произвольном порядке.
Во-вторых приведите пример когда мой код не сработает. Мне самому интересно.
Миниатюры
Найти все повторяющиеся элементы вектора  
mat_for_c
139 / 134 / 29
Регистрация: 26.04.2013
Сообщений: 649
Завершенные тесты: 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
Модератор
Эксперт CЭксперт С++
13052 / 7315 / 814
Регистрация: 27.09.2012
Сообщений: 18,052
Записей в блоге: 3
Завершенные тесты: 1
08.11.2013, 12:59     Найти все повторяющиеся элементы вектора #8
Цитата Сообщение от Ilot Посмотреть сообщение
А у меня правильный.
Croessmah, мне тяжело с вами дискутировать, но мне кажется вы что-то путаете.
В каком месте он правильный?
Должен быть 1 3 2 2 1 4 при таких данных, как на скрине

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

Добавлено через 52 секунды
Цитата Сообщение от Ilot Посмотреть сообщение
А данные могут вводится в произвольном порядке.
Вы просто не верно поняли задание.
Ilot
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
08.11.2013, 13:19     Найти все повторяющиеся элементы вектора #9
Цитата Сообщение от Croessmah Посмотреть сообщение
Вы просто не верно поняли задание.
Ааа... мои извенения. Это действительно так.
DiffEreD
1429 / 766 / 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!
1443 / 1172 / 61
Регистрация: 21.04.2012
Сообщений: 2,449
Завершенные тесты: 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
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 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
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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++
Дан одномерный массив элементов. Необходимо вывести все не повторяющиеся элементы. Использовать можно библиотеки string, iostream. ...

Найти повторяющиеся элементы массива - C++
Необходимо написать программу которая будет находить все повторяющиеся елементы в массиве. Размерность массива 20. Елементы генерируются...

Найти повторяющиеся в массиве элементы - C++
Помогите написать программу: Исходными данными являются массив из 10 элементов, заполненный пользователем с клавиатуры.Написать...

Одномерные массивы, удалить все повторяющиеся элементы, оставив только первые вхождения - C++
Задача на C++: из заданного массива удалить все повторяющиеся элементы, оставив только их первые вхождения. Вот моя программа, помогите...

Обойти все элементы вектора - C++
Как обойти все элементы вектора? Предложите пожалуйста 2 способа


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

Или воспользуйтесь поиском по форуму:
Ilot
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 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     Найти все повторяющиеся элементы вектора
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru