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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
KostyaKulakov
Заблокирован
#1

Не может удалить элемент из вектора - C++

06.10.2012, 09:42. Просмотров 1325. Ответов 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
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#include <iostream>
#include <vector>
#include <ctime> // function RandomInitializationVector
#include <algorithm>
 
void PrintElementVector(std::vector <int> vector);
void RandomInitializationVector(std::vector <int> &vector, int size);
bool Resheto_Atkina(int number);
void DeletePrimes( std::vector<int> & vec );
void primes_up(std::vector <int> &vector1, std::vector <int> &vector2);
 
int main()
{
    std::cout << "Test Vector" << std::endl << std::endl;
 
    //std::vector <type> name; //здесть type - тип данных в векторе, а name - имя вектора
 
    std::vector <int> test;
 
    std::cout << "initialization vector \"test\" " << std::endl << std::endl;
 
    RandomInitializationVector(test, 10);
 
    PrintElementVector(test);
 
    std::cout << "\nGo to Sort vector! Please push key" << std::endl;
 
    std::cin.get();
    
    system("cls");
 
    std::sort(test.begin(), test.end());
 
    PrintElementVector(test);
 
    std::cout << "\nGo to Copy vector! Please push key" << std::endl;
 
    std::cin.get();
    
    system("cls");
 
    std::vector <int> test2;
 
    primes_up(test, test2);
 
    auto size = test.size();
 
    PrintElementVector(test2);
 
    std::cout << "\nGo to Removal of primes in vector! Please push key" << std::endl;
 
    std::cin.get();
    
    system("cls");
 
    DeletePrimes(test);
 
    PrintElementVector(test);
}
 
void RandomInitializationVector(std::vector <int> &vector, int size)
{
    srand(time(0));
 
    for(int i=0; i < size; ++i)
        vector.push_back(rand() % 999);
}
 
void PrintElementVector(std::vector <int> vector)
{
    auto size = vector.size();
 
    for(int i=0; i < size; ++i)
        std::cout << "vector[" << i << "] : " << vector[i] << std::endl;
}
 
void primes_up(std::vector <int> &vector1, std::vector <int> &vector2)
{
    auto size = vector1.size();
 
    int cnt=0;
 
    for(int i=0; i < size; ++i)
    {
        if(Resheto_Atkina(vector1[i]))
            vector2.push_back(vector1[i]);
    }
            
}
 
void DeletePrimes(std::vector<int> &vec)
{
  size_t i, place = 0, limit = vec.size();
 
  for (i = 0; i < limit; ++i) 
  {
     if(Resheto_Atkina(vec[i]))
     {
        vec.erase(vec.begin() + i);
     }
  }
}
 
bool Resheto_Atkina(int number) // [url]http://ru.wikipedia.org/wiki/Решето_Аткина[/url]
{
    int limit = 1000;
    int sqr_lim;
    bool is_prime[1001];
    int x2, y2;
    int i, j, n;
 
    // Инициализация решета
    sqr_lim = (int)sqrt((long double)limit);
    for (i = 0; i <= limit; i++) is_prime[i] = false;
    is_prime[2] = true;
    is_prime[3] = true;
 
    // Предположительно простые - это целые с нечетным числом
    // представлений в данных квадратных формах.
    // x2 и y2 - это квадраты i и j (оптимизация).
    x2 = 0;
    for (i = 1; i <= sqr_lim; i++) {
        x2 += 2 * i - 1;
        y2 = 0;
        for (j = 1; j <= sqr_lim; j++) {
            y2 += 2 * j - 1;
 
            n = 4 * x2 + y2;
            if ((n <= limit) && (n % 12 == 1 || n % 12 == 5))
                is_prime[n] = !is_prime[n];
 
            // n = 3 * x2 + y2; 
            n -= x2; // Оптимизация
            if ((n <= limit) && (n % 12 == 7))
                is_prime[n] = !is_prime[n];
 
            // n = 3 * x2 - y2;
            n -= 2 * y2; // Оптимизация
            if ((i > j) && (n <= limit) && (n % 12 == 11))
                is_prime[n] = !is_prime[n];
        }
    }
 
    // Отсеиваем кратные квадратам простых чисел в интервале [5, sqrt(limit)].
    // (основной этап не может их отсеять)
    for (i = 5; i <= sqr_lim; i++) {
        if (is_prime[i]) {
            n = i * i;
            for (j = n; j <= limit; j += n) {
                is_prime[j] = false;
            }
        }
    }
 
    if(number == 2 || number == 3 || number == 5)
        return true;
 
    for (i = 6; i <= limit; i++) {  // добавлена проверка делимости на 3 и 5. В оригинальной версии алгоритма потребности в ней нет.
        if ((is_prime[i]) && (i % 3 != 0) && (i % 5 !=  0))
        {
 
           if(i == number)
               return true;
        }
 
        }
     return false;
}
DeletePrimes не получается удалить. проблема в том что вылетает программа.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.10.2012, 09:42     Не может удалить элемент из вектора
Посмотрите здесь:

Как удалить строку/столбец из двумерного вектора? C++
Двусвязный список - Добавить элемент после заданного, удалить заданный элемент C++
Наибольший элемент вектора C++
Динамический двусвязный список (операции: добавить элемент после данного, удалить данный элемент …) C++
как из вектора удалить отрицательные числа C++
C++ Извлечь элемент из вектора
Не могу удалить из вектора C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
valeriikozlov
Эксперт C++
4663 / 2489 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
06.10.2012, 10:30     Не может удалить элемент из вектора #2
Цитата Сообщение от KostyaKulakov Посмотреть сообщение
DeletePrimes не получается удалить. проблема в том что вылетает программа.
Правильно что вылетает. См. комментарии:
Цитата Сообщение от KostyaKulakov Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
void DeletePrimes(std::vector<int> &vec)
{
 size_t i, place = 0, limit = vec.size();// допустим изначально vec такой: 1 2 3 4 5 6 7 8 9 10. limit будет равна 10
for (i = 0; i < limit; ++i) 
 {
 if(Resheto_Atkina(vec[i]))// в этом цикле могут быть удалены некоторые элементы vec
 {
 vec.erase(vec.begin() + i);// допустим vec сейчас такой: 1 5 7 (всего три элемента, vec.begin() указывает на элемент 1). И в этоже время i равно 9. Какой элемент мы будем удалять?: vec.begin() + 9
 }
 }
}
-=ЮрА=-
Заблокирован
Автор FAQ
06.10.2012, 10:37     Не может удалить элемент из вектора #3
Цитата Сообщение от KostyaKulakov Посмотреть сообщение
for (i = 0; i < limit; ++i)
* {
* * *if(Resheto_Atkina(vec[i]))
* * *{
* * * * vec.erase(vec.begin() + i);
* * *}
* }
- сама концепция удалять от начала неверна итак поясняю скажем есть вектор со значениями
1 5 16 23 11 т.е 5-ть значений
Так вот скажем
Цитата Сообщение от KostyaKulakov Посмотреть сообщение
if(Resheto_Atkina(vec[i]))
должны удалить сначала 3-й элемент а затем 5й, что ж смотрим отработку
Удаление 3-го элемента
было
1 5 16 23 11
vec.erase(vec.begin() + 2); стало 1 5 23 11 и хотим удалить 5-й элемент, ха а сколько элементов сейчас в векторе, м?
Тут два варианта решения - 1-й удалять от конца, 2-й при удалении не забывать уменьшать счётчик, т.к. в векторе значений стало на 1 меньше, да и в условии окончания изменить с
C++
1
for (i = 0; i < limit; ++i)
на
for (i = 0; i < vec.size(); ++i)
т.к. размер вектора динамически меняется!Вобщем вот вариант возможного решения
f
or (i = 0; i < vec.size(); i++)//Проверять по факт-му размеру вектора!
{
if(Resheto_Atkina(vec[i]))
{
vec.erase(vec.begin() + i);
i--;//Очень важный момент
}
}

Не по теме:

От себя : не рекомендую использовать префиксные инк/дек

Nick Alte
06.10.2012, 11:26
  #4

Не по теме:

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
От себя : не рекомендую использовать префиксные инк/дек
А обоснование? А то солидные авторы советуют как раз привыкать к префиксным и отвыкать от постфиксных, что есть весьма хорошая привычка при использовании итераторов.

silent_1991
07.10.2012, 19:15
  #5

Не по теме:

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
От себя : не рекомендую использовать префиксные инк/дек
Жду обоснования вместе с Nick Alte.

-=ЮрА=-
07.10.2012, 19:36
  #6

Не по теме:

Забейте, пишите как вас научили...

silent_1991
07.10.2012, 19:46
  #7

Не по теме:

-=ЮрА=-, не понял. Ты написал, что это очень важный момент. Почему отказываешься объяснить, чем он так важен? Я лично не понимаю.

DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
07.10.2012, 20:31     Не может удалить элемент из вектора #8
еще есть стандартные алгоритмы:
C++
1
2
3
4
void DeletePrimes(std::vector<int> &vec)
{
  vec.erase(std::remove_if(vec.begin(), vec.end(), &Resheto_Atkina), vec.end());
}
-=ЮрА=-
Заблокирован
Автор FAQ
07.10.2012, 21:31     Не может удалить элемент из вектора #9
silent_1991, я написал под важным моментом уменьшить счетчик,потому что если этого не сделать то на следующей итерации будет пропущен элемент ставший на место удаленного,это же очевидно!А забить я просил на фразу о постфиксе и префиксе,кому удобно с префиксом пусть пишет,переубеждать я никого не собираюсь,оно мне ни к чему...

Добавлено через 5 минут

Не по теме:

Мнемоника ерайз без декримента
1 2 3 4 удаляем двойку,тогда тройка станет на место двойки, при этом счетчик на след итерации станет 3 получится что в векторе 1 3 4 будем рассматривать 4ку а 3ку пропустили-я считал это видно каждому

silent_1991
Эксперт С++
4951 / 3027 / 149
Регистрация: 11.11.2009
Сообщений: 7,026
Завершенные тесты: 1
07.10.2012, 22:00     Не может удалить элемент из вектора #10
-=ЮрА=-, ну знаешь, если ты не рекомендуешь использовать префиксный декремент, неплохо было бы аргументировать свою позицию. Никто никого переубеждать не прости. Просьба была объяснить свою столь стойкую позицию, что она переросла в рекомендацию. Рекомендации ведь просто так не дают.
-=ЮрА=-
Заблокирован
Автор FAQ
08.10.2012, 07:35     Не может удалить элемент из вектора #11
silent_1991, я не хочу устраивать холивор на несколько листов!Рекомендация не указание,кто захочёт прислушается.
BRcr
08.10.2012, 09:25
  #12

Не по теме:

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
От себя : не рекомендую использовать префиксные инк/дек
Цитата Сообщение от Nick Alte Посмотреть сообщение
А то солидные авторы советуют как раз привыкать к префиксным и отвыкать от постфиксных, что есть весьма хорошая привычка при использовании итераторов.
Странно выглядит как первое, так и второе. В зависимости от логики выражения где-то нужен префиксный, где-то - постфиксный оператор; это не более, чем способ регулировки момента модификации объекта. И все, тут даже и спорить-то не о чем.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.10.2012, 09:28     Не может удалить элемент из вектора
Еще ссылки по теме:

C++ Вывести последний элемент вектора
Удалить все отрицательные компоненты вектора C++
C++ Указатель на элемент вектора
Удалить элемент вектора посредством erase C++

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт С++
4951 / 3027 / 149
Регистрация: 11.11.2009
Сообщений: 7,026
Завершенные тесты: 1
08.10.2012, 09:28     Не может удалить элемент из вектора #13
Цитата Сообщение от BRcr Посмотреть сообщение
В зависимости от логики выражения где-то нужен префиксный, где-то - постфиксный оператор
Это верно. Однако когда оператор одиночный и используется исключительно для инкремента/декремента, лучше использовать их префиксную версию. И тут, тадам!, следует банальщина: префиксный инкремент не создаёт временной копии, которая является результатом его работы, что в случае одиночного оператора совершенно ненужно.
Yandex
Объявления
08.10.2012, 09:28     Не может удалить элемент из вектора
Ответ Создать тему
Опции темы

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