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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 36, средняя оценка - 4.89
neske
1495 / 862 / 82
Регистрация: 26.03.2010
Сообщений: 2,951
#1

Обращение к определенному элементу списка. - C++

11.05.2010, 16:05. Просмотров 5255. Ответов 23
Метки нет (Все метки)

Сабж.
К примеру, имеется список:
C++
1
list <int> L;
И есть цикл:
C++
1
2
3
list <int>::iterator i;
    for (i=L.begin() ; i!=L.end() ; i++) {
        // и вот тут, как мне обратится к i-ому элементу списка?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.05.2010, 16:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обращение к определенному элементу списка. (C++):

Что быстрее? Обращение к элементу массива или к элементу структуры? - C++
Обращение к элементу массива или к элементу структуры? Экспериментирую с кодом и получается примерно одинаково. Что интересно, время на...

Обращение к элементу массива - C++
Объясните пожалуйста, что происходит в строке помеченной *** void main(){ char str; char ptr; cin &gt;&gt; str; cout &lt;&lt; ...

Обращение к элементу матрицы - C++
как зделать операцию A template &lt;class T&gt; class matrix{ T **mat; int n, m; public: matrix(int a, int b); void...

Обращение к элементу массива - C++
Как мне обратиться к последнему элементу массива? например: Array // i = 0 тут нужно что бы -1 был последним т.е N-1 //можно ли с...

Списки. К каждому элементу списка прибавить значение следующего элемента списка. Последний элемент не менять - C++
Данные списка должен ввести пользователь. Результат нужно сформировать в начальном списке, никаких новых списков создавать нельзя. Спасибо!

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
easybudda
Модератор
Эксперт CЭксперт С++
9632 / 5580 / 948
Регистрация: 25.07.2009
Сообщений: 10,714
11.05.2010, 16:17 #2
Цитата Сообщение от neske Посмотреть сообщение
И есть цикл:
C++
1
2
3
4
list <int>::iterator i;
    for (i=L.begin() ; i!=L.end() ; i++) {
        // и вот тут, как мне обратится к i-ому элементу списка?
    std::cout << *i << std::endl;
как-то так
0
neske
1495 / 862 / 82
Регистрация: 26.03.2010
Сообщений: 2,951
11.05.2010, 16:21  [ТС] #3
easybudda, с выводом мне понятно
А если, к примеру, нужно убрать все нечетные элементы?
C++
1
2
for (i=L.begin() ; i!=L.end() ; i++) 
           if (*i%2) L.erase(i);
Если такой вариант, то при выполнении программы вылетает критическая ошибка.
0
easybudda
Модератор
Эксперт CЭксперт С++
9632 / 5580 / 948
Регистрация: 25.07.2009
Сообщений: 10,714
11.05.2010, 16:42 #4
Цитата Сообщение от neske Посмотреть сообщение
А если, к примеру, нужно убрать все нечетные элементы?
Тогда и цикл не нужен
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
#include <iostream>
#include <list>
#include <algorithm>
#include <iterator>
 
bool isOdd(int num){
    return ( num & 1 );
}
 
int main(){
    std::list<int> L;
    L.push_back(5);
    L.push_back(2);
    L.push_back(6);
    L.push_back(9);
    L.push_back(4);
    L.push_back(3);
    L.push_back(8);
 
    std::cout << "All list:" << std::endl;
    std::copy(L.begin(), L.end(), std::ostream_iterator<int>(std::cout, " "));
 
    L.remove_if(isOdd);
 
    std::cout << std::endl << "Without odds:" << std::endl;
    std::copy(L.begin(), L.end(), std::ostream_iterator<int>(std::cout, " "));
 
    std::cout << std::endl;
 
    return 0;
}
1
neske
1495 / 862 / 82
Регистрация: 26.03.2010
Сообщений: 2,951
11.05.2010, 16:53  [ТС] #5
Спасибо, я понял.
А вообще, в примере, предложенном мною, как сделать? И вообще, можно ли?
Это мне так, для общего развития)
0
easybudda
Модератор
Эксперт CЭксперт С++
9632 / 5580 / 948
Регистрация: 25.07.2009
Сообщений: 10,714
11.05.2010, 17:19 #6
Цитата Сообщение от neske Посмотреть сообщение
А вообще, в примере, предложенном мною, как сделать? И вообще, можно ли?
Нельзя так делать! Первый же вызов L.erase(i) делает итератор i бессмысленным, и использовать его больше нельзя. Если уж так хочется цикл устроить, то можно вот так написать:
C++
1
2
3
4
5
6
...
std::list<int> L;
...
std::list<int>::iterator i;
while ( ( i = std::find_if(L.begin(), L.end(), isOdd) ) != L.end() )
  L.erase(i);
зачем только?
1
neske
1495 / 862 / 82
Регистрация: 26.03.2010
Сообщений: 2,951
11.05.2010, 18:25  [ТС] #7
easybudda, спасибо еще раз
0
neske
1495 / 862 / 82
Регистрация: 26.03.2010
Сообщений: 2,951
16.05.2010, 21:27  [ТС] #8
Ребят, а вот еще вопрос на счет векторов.

Приведу пример с масивом:
C++
1
int MAS[size]={1,2,3,4,5};
Тут мы сразу заполнили все ячейки.

Можно ли аналогичную операцию проделать с вектором?
Или только так:
C++
1
2
3
4
5
vector <int> v;
 
v.push_back(1);
v.push_back(2);
// и т.п.
?
0
easybudda
Модератор
Эксперт CЭксперт С++
9632 / 5580 / 948
Регистрация: 25.07.2009
Сообщений: 10,714
16.05.2010, 21:46 #9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
    
int main(){
    const int SIZE = 5;
    int arr[SIZE] = { 5, 4, 3, 2, 1 };
    std::vector<int> vec;
    vec.assign(arr, arr + SIZE);
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));
    return 0;
}
1
neske
1495 / 862 / 82
Регистрация: 26.03.2010
Сообщений: 2,951
16.05.2010, 21:53  [ТС] #10
Ясно, спасибо.
То есть имеется два способа?
-функция push_back (или аналогичные)
-функция assign
0
easybudda
Модератор
Эксперт CЭксперт С++
9632 / 5580 / 948
Регистрация: 25.07.2009
Сообщений: 10,714
16.05.2010, 22:18 #11
Цитата Сообщение от neske Посмотреть сообщение
То есть имеется два способа?
Гораздо больше... std::copy(), std::generate(), std::fill() и куча их вариантов...
1
neske
1495 / 862 / 82
Регистрация: 26.03.2010
Сообщений: 2,951
16.05.2010, 22:32  [ТС] #12
Так, спасибо.
C++
1
/*name*/ (v.begin(), v.end(), rand()%10);
А такой вариант возможен?)
0
easybudda
Модератор
Эксперт CЭксперт С++
9632 / 5580 / 948
Регистрация: 25.07.2009
Сообщений: 10,714
16.05.2010, 23:40 #13
neske,
Цитата Сообщение от neske Посмотреть сообщение
А такой вариант возможен?)
Не... Если просто rand поставить, то прокатит. Если нужно ограничивать диапазон чисел, всё немного замороченнее...
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
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
#include <iterator>
#include <cstdlib>
#include <ctime>
 
class RndNum {
    int limit;
public:
    RndNum(int lim) : limit(lim) {}
    int operator() (){
        return rand() % limit;
    }
};
 
int main(){
    const int SIZE = 20;
    const int LIMIT = 10;
    std::vector<int> vec(SIZE);
 
    srand(time(NULL));
 
    std::generate(vec.begin(), vec.end(), RndNum(LIMIT));
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));
 
    exit(0);
}
1
neske
1495 / 862 / 82
Регистрация: 26.03.2010
Сообщений: 2,951
17.05.2010, 15:46  [ТС] #14
Оно не стоит того ))


easybudda, спасибо еще раз

Добавлено через 15 часов 56 минут
А, вот еще так можно)

C++
1
2
3
srand(time(NULL));
for (int i=0; i<size; i++)
    v.push_back(rand()%9+1);(
0
easybudda
Модератор
Эксперт CЭксперт С++
9632 / 5580 / 948
Регистрация: 25.07.2009
Сообщений: 10,714
17.05.2010, 16:33 #15
neske, ага... только без самурайского смайла в хвосте
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2010, 16:33
Привет! Вот еще темы с ответами:

STL обращение к элементу list - C++
Помогите исправить ошибку. #include &lt;list&gt; #include &lt;iostream&gt; using namespace std; class PeopleB{ public: int xxx; }; ...

STL . Обращение к 12 элементу вектора - C++
Добрый вечер, форумчане! Столкнулся вот с такой проблемой. Имеется вектор, заполненный числами, огромной длины. Но почему-то не хочет...

Обращение к следующему элементу в for-each цикле - C++
Как обратиться к следующему элементу for each цикла? Например, в цикле for (auto &amp;el : text_vector) { if (el &gt; следующий...

STL обращение к элементу vector - C++
Помогите исправить ошибку. #include &lt;iostream&gt; #include &lt;vector&gt; using namespace std; class otschet { public: double...


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

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

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