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

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

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

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

06.10.2012, 09:42. Просмотров 1337. Ответов 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 не получается удалить. проблема в том что вылетает программа.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.10.2012, 09:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не может удалить элемент из вектора (C++):

Удалить элемент вектора посредством erase - C++
# include &lt;iostream&gt; # include &lt;vector&gt; # include &lt;iterator&gt; # include &lt;string&gt; # include &lt;fstream&gt; using namespace std; ...

Определить количество положительных элементов вектора С(10) и заменить этим значением минимальный элемент вектора А(5) - C++
Ребята помогите пожалуйста с задачкой. Я сам не шарю в C++, но в этом семестре появился этот предмет! И завтра его надо будет сдать :( Буду...

Изменение вектора. Наибольший элемент вектора - C++
Добрый день, нужна оценка кода. Пропустил занятия, делал по теории, опирался на массивы. Скажите, правильно ли реализовано? Создать...

Структура "Информация": - носитель; - объем; - название; - автор. Удалить первый элемент с заданным объемом информации, добавить элемент перед элемент - C++
Структура &quot;Информация&quot;: - носитель; - объем; - название; - автор. Удалить первый элемент с заданным объемом информации, добавить...

Не могу удалить из вектора - C++
Доброе время суток. Есть класс class TModelAnswer { private: char FAnswer; float FProbability; AnsiString...

Двусвязный список - Добавить элемент после заданного, удалить заданный элемент - C++
Реализуйте списочную структуру в виде класса. работа состоит из двух частей: из класса (структуры, алгоритма) и из тестирующего кода. ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
valeriikozlov
Эксперт C++
4670 / 2496 / 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
 }
 }
}
1
-=ЮрА=-
Заблокирован
Автор 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--;//Очень важный момент
}
}

Не по теме:

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

0
Nick Alte
06.10.2012, 11:26
  #4

Не по теме:

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

0
silent_1991
07.10.2012, 19:15
  #5

Не по теме:

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

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

Не по теме:

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

0
silent_1991
07.10.2012, 19:46
  #7

Не по теме:

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

0
DU
1483 / 1059 / 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());
}
0
-=ЮрА=-
Заблокирован
Автор FAQ
07.10.2012, 21:31 #9
silent_1991, я написал под важным моментом уменьшить счетчик,потому что если этого не сделать то на следующей итерации будет пропущен элемент ставший на место удаленного,это же очевидно!А забить я просил на фразу о постфиксе и префиксе,кому удобно с префиксом пусть пишет,переубеждать я никого не собираюсь,оно мне ни к чему...

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

Не по теме:

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

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

Не по теме:

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

0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
08.10.2012, 09:28 #13
Цитата Сообщение от BRcr Посмотреть сообщение
В зависимости от логики выражения где-то нужен префиксный, где-то - постфиксный оператор
Это верно. Однако когда оператор одиночный и используется исключительно для инкремента/декремента, лучше использовать их префиксную версию. И тут, тадам!, следует банальщина: префиксный инкремент не создаёт временной копии, которая является результатом его работы, что в случае одиночного оператора совершенно ненужно.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.10.2012, 09:28
Привет! Вот еще темы с ответами:

Как удалить нужный элемент из списка или заменить этот элемент на другой? - C++
Доброго времени суток, господа! Есть список: list&lt;double&gt; list1; Есть возможность добавить в начало или в конец списка елементы:...

как из вектора удалить отрицательные числа - C++
Создать вектор, заполнить его случайными целыми числами в интервале от -10 до 10. Вывести в ListBox. Затем удалить из него все...

Удалить все отрицательные компоненты вектора - C++
дано а(5) b(10) преобразовать вектор с наименьшим min по правилу: все отрицательные компоненты вектора удалить. в программе турбо си ++

Динамический двусвязный список (операции: добавить элемент после данного, удалить данный элемент …) - C++
реализовать Динамический двусвязный список (операции: добавить элемент после данного, удалить данный элемент …). используя: class List...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
08.10.2012, 09:28
Ответ Создать тему
Опции темы

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