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

map - заполнение и удаление - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.65
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
29.10.2013, 10:40     map - заполнение и удаление #1
Хочу проинициализировать map случайными числами и вывести на экран.
Скажите, в чем ошибка?

Объявление:
C++
1
2
std::map <int, int> myMap;
std::map <int, int> :: iterator it = myMap.begin();
Инициализация случайными числами (подчеркивает красным "="):
C++
1
2
while (it != myMap.end())
    myMap.begin() = generateRandomNumber();
Вывод на экран (подчеркивает красным "["):
C++
1
2
for (myMap.begin(); it != myMap.end(); it++)
    std::cout << myMap[it] << " ";
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,333
Завершенные тесты: 1
29.10.2013, 10:49     map - заполнение и удаление #2
Цитата Сообщение от dimakozyr Посмотреть сообщение
Инициализация случайными числами (подчеркивает красным "="):
Вы поступаете аналогично вот такому:
C++
1
2
int foo(){return 7;}
foo() = 9;
Цитата Сообщение от dimakozyr Посмотреть сообщение
Вывод на экран (подчеркивает красным "["):
C++
1
2
for (myMap.begin(); it != myMap.end(); it++)
    std::cout << *it << " ";
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
29.10.2013, 10:52     map - заполнение и удаление #3
dimakozyr, Ну... Эм. А посмотреть что такое map?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <map>
#include <cstdlib>
#include <ctime>
 
int main()
{
   const size_t iterations = 10;
   srand(time(0));
   std::map<int, int> values;
   for (size_t i = 0; i < iterations; ++i)
   {
      values.insert(std::make_pair(rand() % 100, rand() % 100));
   }
   for (std::map<int, int>::iterator pos = values.begin(); pos != values.end(); ++pos)
   {
      std::cout << "key: " << pos->first << " value: " << pos->second << std::endl;
   }
}
Добавлено через 1 минуту
SatanaXIII, Неверный ответ. Плюс к тому у pair нету оператора вывода.
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
29.10.2013, 11:04  [ТС]     map - заполнение и удаление #4
А как можно удалять элементы из map?
Искал, но везде лишь обрывки кода, не очень понятно
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,333
Завершенные тесты: 1
29.10.2013, 11:11     map - заполнение и удаление #5
Цитата Сообщение от ForEveR Посмотреть сообщение
Неверный ответ.
Да. Мой косяк.
Цитата Сообщение от ForEveR Посмотреть сообщение
Плюс к тому у pair нету оператора вывода.
А можно поподробнее? А то, с вашего позволения:
C++
1
2
3
4
5
6
7
8
   /*for (std::map<int, int>::iterator pos = values.begin(); pos != values.end(); ++pos)
   {
      std::cout << "key: " << pos->first << " value: " << pos->second << std::endl;
   }*/
 
   std::map<int, int>::iterator it = values.begin();
   for (values.begin(); it != values.end(); it++)
    std::cout << it->first << " ";
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
29.10.2013, 11:23     map - заполнение и удаление #6
SatanaXIII, Данный вывод выведет ключи мапы. Если же попытаться вывести *it будет ошибка.
dimakozyr, erase очевидным образом.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,333
Завершенные тесты: 1
29.10.2013, 11:55     map - заполнение и удаление #7
Цитата Сообщение от ForEveR Посмотреть сообщение
Если же попытаться вывести *it будет ошибка.
Да.
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Мой косяк.
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
29.10.2013, 12:17  [ТС]     map - заполнение и удаление #8
Нужно пройтись по вектору и по map и удалить их обоих все неповторяющиеся элементы,
т.е. оставить дубликаты. Не очень понимаю, как это сделать
C++
1
2
3
4
5
6
7
8
// Обход вектора
for (int i = 0; i < sizeOfContainer; i++)
        // Обход map
    for (std::map<int, int>::iterator pos = myMap.begin(); pos != myMap.end(); ++pos)
        if (myVector[i] != myMap[i]) {
            myVector.pop_back();
            myMap.erase(i);
        }
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4923 / 2666 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
29.10.2013, 12:32     map - заполнение и удаление #9
Цитата Сообщение от SatanaXIII Посмотреть сообщение
for (myMap.begin(); it != myMap.end(); it++)
косяк №2
Предпочитайте префиксную запись постфиксной, не создаются лишние объекты, для итераторов это существенно.

Не по теме:

И не надо мне про оптимизацию рассказывать, глупо надеяться на машину



Добавлено через 5 минут
Цитата Сообщение от dimakozyr Посмотреть сообщение
удалить их обоих все неповторяющиеся элементы
именно vector и map? Т.е. если не найден ключ, равный элементу вектора, то удалить его из вектора, аналагично для map? Просто не ясно, для чего тогда пары в map нужны?

Есть полный текст задания?
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
29.10.2013, 12:38     map - заполнение и удаление #10
Цитата Сообщение от ForEveR Посмотреть сообщение
C++
1
2
3
4
for (size_t i = 0; i < iterations; ++i)
{
   values.insert(std::make_pair(rand() % 100, rand() % 100));
}
помоему так будет лучше
(я про тот случай когда ключи от 0 до 10 должны быть все использованы)
C++
1
2
3
4
for (size_t i = 0; i < 10; ++i)
{
   values[i] = rand() % 100;
}
надо же каким то образом исключать случайные ключи, куда вы уже записали
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,333
Завершенные тесты: 1
29.10.2013, 12:39     map - заполнение и удаление #11
Цитата Сообщение от MrGluck Посмотреть сообщение
косяк
Не соглашусь.
Цитата Сообщение от MrGluck Посмотреть сообщение
не создаются лишние объекты
С точки зрения миркооптимизации да.
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
29.10.2013, 12:41  [ТС]     map - заполнение и удаление #12
Цитата Сообщение от MrGluck Посмотреть сообщение
Есть полный текст задания?
Да, вот он:
1.заполнить случайными числами от 1 до 9 значения контейнеров vector[i] и map[i];
2.удалить случайное число элементов (не более 15) в каждом контейнере;
3.после этого провести синхронизацию, чтобы в vector и map остались только имеющиеся в обоих контейнерах элементы (дубликаты не удалять).
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
29.10.2013, 12:42     map - заполнение и удаление #13
XRuZzz, Они так и так будут исключены. insert не вставит более одного элемента с одним ключом.
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
29.10.2013, 12:44     map - заполнение и удаление #14
Цитата Сообщение от ForEveR Посмотреть сообщение
XRuZzz, Они так и так будут исключены. insert не вставит более одного элемента с одним ключом.
вы же ожидаете создать 10 пар, а вместо этого создадите 10 - (количество снова выпавших чисел)
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
29.10.2013, 12:46     map - заполнение и удаление #15
XRuZzz, Код с [] аналогично так-то, единственное что - значение при повторе будет изменено. Проверить это естественно запросто.
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
#include <iostream>
#include <map>
#include <cstdlib>
#include <ctime>
 
int main()
{
   const size_t iterations = 10;
   srand(time(0));
   std::map<int, int> values;
   for (size_t i = 0; i < iterations; ++i)
   {
      auto pos = values.insert(std::make_pair(rand() % 10, rand() % 10));
      if (!pos.second)
      {
         std::cout << "duplicate: " << pos.first->first << std::endl;
         --i;
      }
   }
   for (std::map<int, int>::iterator pos = values.begin(); pos != values.end(); ++pos)
   {
      std::cout << "key: " << pos->first << " value: " << pos->second << std::endl;
   }
}
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
29.10.2013, 12:51     map - заполнение и удаление #16
я что то сомневаюсь, что вы хотели получить такую ситуацию:
выпала пара (2; 4)
вставили
i[2] = 4
выпала (2; 7)
ничего не вставили
в итоге прошло 10 итераций, а получилось только 9 пар. Так можно и всего лишь одну пару случайно сгенерировать.

я не пытался исправить ваш алгоритм скобками [], я просто написал более тривиальный способ заполнения, который может устроить ТС
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
29.10.2013, 12:53     map - заполнение и удаление #17
XRuZzz, Согласен. Мне просто лень было добавлять проверку. Сейчас проверка добавлена и данной ситуации соответственно не будет.
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
29.10.2013, 12:56  [ТС]     map - заполнение и удаление #18
Цитата Сообщение от dimakozyr Посмотреть сообщение
Нужно пройтись по вектору и по map и удалить из обоих все неповторяющиеся элементы,
т.е. оставить дубликаты
Эм.. так как все-таки это сделать можно?

Добавлено через 1 минуту
В смысле, этот код ведь только с map работает
Цитата Сообщение от ForEveR Посмотреть сообщение
#include <iostream>
#include <map>
#include <cstdlib>
#include <ctime>
int main()
{
* *const size_t iterations = 10;
* *srand(time(0));
* *std::map<int, int> values;
* *for (size_t i = 0; i < iterations; ++i)
* *{
* * * auto pos = values.insert(std::make_pair(rand() % 10, rand() % 10));
* * * if (!pos.second)
* * * {
* * * * *std::cout << "duplicate: " << pos.first->first << std::endl;
* * * * *--i;
* * * }
* *}
* *for (std::map<int, int>::iterator pos = values.begin(); pos != values.end(); ++pos)
* *{
* * * std::cout << "key: " << pos->first << " value: " << pos->second << std::endl;
* *}
}
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
29.10.2013, 13:18     map - заполнение и удаление #19
Цитата Сообщение от dimakozyr Посмотреть сообщение
В смысле, этот код ведь только с map работает
ваши возрастающие запросы подтолкнули меня на мысль сделать что то вроде
(описываю только идею, поэтому к коду придираться не нужно)
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
#include <iostream>
#include <map>
#include <cstdlib>
#include <ctime>
 
using std::vector;
using std::map;
 
template <typename T>
bool generate(T values, size_t n)
{
  for (size_t i = 0; i < n; ++i)
  {
      values[i] = rand() % 100;
  }
  return true;
}
 
int main()
{
  size_t n = 10;
  vector v(n);
  map m;
  srand(time(0));
  generate<vector>(v, n);
  generate<map>(m, n);
...
}
То есть условие задачи подталкивает вас создать шаблон класса для работы с vector и map

Добавлено через 6 минут
можно назвать такой шаблон например RandomContainers
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.10.2013, 13:19     map - заполнение и удаление
Еще ссылки по теме:

Приведение map<int, B> к map<int, A> C++
C++ Map: заполнение, поиск
C++ Map of map

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

Или воспользуйтесь поиском по форуму:
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
29.10.2013, 13:19  [ТС]     map - заполнение и удаление #20
Цитата Сообщение от XRuZzz Посмотреть сообщение
ваши возрастающие запросы подтолкнули меня на мысль сделать что то вроде
(описываю только идею, поэтому к коду придираться не нужно)
Спасибо, просто, в STL еще не силен, а задачу решать нужно
Yandex
Объявления
29.10.2013, 13:19     map - заполнение и удаление
Ответ Создать тему
Опции темы

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