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

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

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

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

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

Сабж.
К примеру, имеется список:
C++
1
list <int> L;
И есть цикл:
C++
1
2
3
list <int>::iterator i;
    for (i=L.begin() ; i!=L.end() ; i++) {
        // и вот тут, как мне обратится к i-ому элементу списка?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.05.2010, 16:05     Обращение к определенному элементу списка.
Посмотрите здесь:
C++ Что быстрее? Обращение к элементу массива или к элементу структуры?
Обращение к элементу массива C++
Обращение к элементу матрицы C++
Обращение к элементу массива C++
Разработать класс Итератор, методы которого: переход в начало списка, в конец, к текущему элементу списка, к с C++
C++ Списки. К каждому элементу списка прибавить значение следующего элемента списка. Последний элемент не менять
STL обращение к элементу vector C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Эксперт CЭксперт С++
9461 / 5474 / 927
Регистрация: 25.07.2009
Сообщений: 10,496
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;
как-то так
neske
1479 / 846 / 75
Регистрация: 26.03.2010
Сообщений: 2,904
11.05.2010, 16:21  [ТС]     Обращение к определенному элементу списка. #3
easybudda, с выводом мне понятно
А если, к примеру, нужно убрать все нечетные элементы?
C++
1
2
for (i=L.begin() ; i!=L.end() ; i++) 
           if (*i%2) L.erase(i);
Если такой вариант, то при выполнении программы вылетает критическая ошибка.
easybudda
Эксперт CЭксперт С++
9461 / 5474 / 927
Регистрация: 25.07.2009
Сообщений: 10,496
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;
}
neske
1479 / 846 / 75
Регистрация: 26.03.2010
Сообщений: 2,904
11.05.2010, 16:53  [ТС]     Обращение к определенному элементу списка. #5
Спасибо, я понял.
А вообще, в примере, предложенном мною, как сделать? И вообще, можно ли?
Это мне так, для общего развития)
easybudda
Эксперт CЭксперт С++
9461 / 5474 / 927
Регистрация: 25.07.2009
Сообщений: 10,496
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);
зачем только?
neske
1479 / 846 / 75
Регистрация: 26.03.2010
Сообщений: 2,904
11.05.2010, 18:25  [ТС]     Обращение к определенному элементу списка. #7
easybudda, спасибо еще раз
neske
1479 / 846 / 75
Регистрация: 26.03.2010
Сообщений: 2,904
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);
// и т.п.
?
easybudda
Эксперт CЭксперт С++
9461 / 5474 / 927
Регистрация: 25.07.2009
Сообщений: 10,496
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;
}
neske
1479 / 846 / 75
Регистрация: 26.03.2010
Сообщений: 2,904
16.05.2010, 21:53  [ТС]     Обращение к определенному элементу списка. #10
Ясно, спасибо.
То есть имеется два способа?
-функция push_back (или аналогичные)
-функция assign
easybudda
Эксперт CЭксперт С++
9461 / 5474 / 927
Регистрация: 25.07.2009
Сообщений: 10,496
16.05.2010, 22:18     Обращение к определенному элементу списка. #11
Цитата Сообщение от neske Посмотреть сообщение
То есть имеется два способа?
Гораздо больше... std::copy(), std::generate(), std::fill() и куча их вариантов...
neske
1479 / 846 / 75
Регистрация: 26.03.2010
Сообщений: 2,904
16.05.2010, 22:32  [ТС]     Обращение к определенному элементу списка. #12
Так, спасибо.
C++
1
/*name*/ (v.begin(), v.end(), rand()%10);
А такой вариант возможен?)
easybudda
Эксперт CЭксперт С++
9461 / 5474 / 927
Регистрация: 25.07.2009
Сообщений: 10,496
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);
}
neske
1479 / 846 / 75
Регистрация: 26.03.2010
Сообщений: 2,904
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);(
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2010, 16:33     Обращение к определенному элементу списка.
Еще ссылки по теме:
C++ Обращение к элементу массива из строк
C++ Обращение к следующему элементу в for-each цикле
C++ Приоритет. Обращение к элементу по постинкременту.
C++ Обращение к последнему элементу вектора
STL . Обращение к 12 элементу вектора C++

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

Или воспользуйтесь поиском по форуму:
easybudda
Эксперт CЭксперт С++
9461 / 5474 / 927
Регистрация: 25.07.2009
Сообщений: 10,496
17.05.2010, 16:33     Обращение к определенному элементу списка. #15
neske, ага... только без самурайского смайла в хвосте
Yandex
Объявления
17.05.2010, 16:33     Обращение к определенному элементу списка.
Ответ Создать тему
Опции темы

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