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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 36, средняя оценка - 4.89
neske
1426 / 793 / 56
Регистрация: 26.03.2010
Сообщений: 2,734
11.05.2010, 16:05     Обращение к определенному элементу списка. #1
Сабж.
К примеру, имеется список:
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++
STL . Обращение к 12 элементу вектора C++
STL обращение к элементу vector C++
C++ Списки. К каждому элементу списка прибавить значение следующего элемента списка. Последний элемент не менять
C++ Обращение к элементу массива из строк
C++ Приоритет. Обращение к элементу по постинкременту.
C++ Обращение к предпоследнему элементу vector
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9383 / 5433 / 916
Регистрация: 25.07.2009
Сообщений: 10,428
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
1426 / 793 / 56
Регистрация: 26.03.2010
Сообщений: 2,734
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
Модератор
Эксперт С++
 Аватар для easybudda
9383 / 5433 / 916
Регистрация: 25.07.2009
Сообщений: 10,428
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
1426 / 793 / 56
Регистрация: 26.03.2010
Сообщений: 2,734
11.05.2010, 16:53  [ТС]     Обращение к определенному элементу списка. #5
Спасибо, я понял.
А вообще, в примере, предложенном мною, как сделать? И вообще, можно ли?
Это мне так, для общего развития)
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9383 / 5433 / 916
Регистрация: 25.07.2009
Сообщений: 10,428
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
1426 / 793 / 56
Регистрация: 26.03.2010
Сообщений: 2,734
11.05.2010, 18:25  [ТС]     Обращение к определенному элементу списка. #7
easybudda, спасибо еще раз
neske
1426 / 793 / 56
Регистрация: 26.03.2010
Сообщений: 2,734
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
Модератор
Эксперт С++
 Аватар для easybudda
9383 / 5433 / 916
Регистрация: 25.07.2009
Сообщений: 10,428
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
1426 / 793 / 56
Регистрация: 26.03.2010
Сообщений: 2,734
16.05.2010, 21:53  [ТС]     Обращение к определенному элементу списка. #10
Ясно, спасибо.
То есть имеется два способа?
-функция push_back (или аналогичные)
-функция assign
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9383 / 5433 / 916
Регистрация: 25.07.2009
Сообщений: 10,428
16.05.2010, 22:18     Обращение к определенному элементу списка. #11
Цитата Сообщение от neske Посмотреть сообщение
То есть имеется два способа?
Гораздо больше... std::copy(), std::generate(), std::fill() и куча их вариантов...
neske
1426 / 793 / 56
Регистрация: 26.03.2010
Сообщений: 2,734
16.05.2010, 22:32  [ТС]     Обращение к определенному элементу списка. #12
Так, спасибо.
C++
1
/*name*/ (v.begin(), v.end(), rand()%10);
А такой вариант возможен?)
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9383 / 5433 / 916
Регистрация: 25.07.2009
Сообщений: 10,428
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
1426 / 793 / 56
Регистрация: 26.03.2010
Сообщений: 2,734
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);(
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9383 / 5433 / 916
Регистрация: 25.07.2009
Сообщений: 10,428
17.05.2010, 16:33     Обращение к определенному элементу списка. #15
neske, ага... только без самурайского смайла в хвосте
neske
1426 / 793 / 56
Регистрация: 26.03.2010
Сообщений: 2,734
18.05.2010, 17:13  [ТС]     Обращение к определенному элементу списка. #16
Не хотел создавать новую тему, напишу тут.

В каком направлении мне идти, если моя задача научится делать элементарные программы, но с пользовательским интерфейсом? К примеру, те же крестики-нолики, но с возможностью нажать "New game", "Exit". Это всего лишь пример, и мб неудачный. Но я надеюсь что вы меня поняли

Добавлено через 2 минуты
И конечно буду сильно благодарен за хорошую литературу.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9383 / 5433 / 916
Регистрация: 25.07.2009
Сообщений: 10,428
18.05.2010, 17:47     Обращение к определенному элементу списка. #17
Цитата Сообщение от neske Посмотреть сообщение
В каком направлении мне идти, если моя задача научится делать элементарные программы, но с пользовательским интерфейсом?
Я бы Qt посоветовал. Сам освоить пытаюсь, правда, не легко пока даётся. И с книжками засада. Единственная бумажная, которую нашёл (ну люблю я бумажные книжки) - Ю. Земсков "Qt 4 на примерах". Не очень хорошая книжка - сумбурно всё как-то, и многие примеры мягко говоря сомнительно написаны. За то в самом Qt помощь не плохо сделана - при желании можно разобраться...
neske
1426 / 793 / 56
Регистрация: 26.03.2010
Сообщений: 2,734
19.05.2010, 15:06  [ТС]     Обращение к определенному элементу списка. #18
Спасибо.
А что на счет литературы из этой темы, может быть кто-нибудь пользовался? (в конце)
http://www.cyberforum.ru/cpp-cross-p...read79698.html
neske
1426 / 793 / 56
Регистрация: 26.03.2010
Сообщений: 2,734
07.06.2010, 17:58  [ТС]     Обращение к определенному элементу списка. #19
Прошу прощения, но сижу в ступоре.
Обращаюсь за помощью, ибо не могу найти ошибку, хоть убейте.

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
#include <iostream>
#include <ctime>
#include <vector>
#include <algorithm>
#include <iterator>
 
int rnd ()
{
    return rand()%101-50;
}
 
bool neg_el (int x)
{
    return (x<0);
}
 
int main()
{
    // initial
    const int size=20;
    std::vector <int> vec (size);
    // fill
    srand (time(NULL));
    std::generate_n (vec.begin(), vec.size(), rnd);
    // output start matrix
    std::cout << "Start matrix:\n";
    std::copy (vec.begin(), vec.end(), std::ostream_iterator <int> (std::cout, " "));
    std::cout << std::endl;
    // output negative elements
    std::vector <int> :: iterator it;
    std::cout << "Negative elements: ";
    while ( (it=std::find_if (vec.begin(), vec.end(), neg_el) ) != vec.end())
        std::cout << *it << " ";
    std::cout << std::endl;
 
    system ("pause");
    return 0;
}
Добавлено через 26 секунд
Программа зацикливается.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.06.2010, 18:10     Обращение к определенному элементу списка.
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9383 / 5433 / 916
Регистрация: 25.07.2009
Сообщений: 10,428
07.06.2010, 18:10     Обращение к определенному элементу списка. #20
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
#include <iostream>
#include <ctime>
#include <vector>
#include <algorithm>
#include <iterator>
#include <cstdlib> /* вот этого не хватало */
 
int rnd ()
{
    return rand()%101-50;
}
 
bool neg_el (int x)
{
    return (x<0);
}
 
int main()
{
    // initial
    const int size=20;
    std::vector <int> vec (size);
    // fill
    srand (time(NULL));
    std::generate_n (vec.begin(), vec.size(), rnd);
    // output start matrix
    std::cout << "Start matrix:\n";
    std::copy (vec.begin(), vec.end(), std::ostream_iterator <int> (std::cout, " "));
    std::cout << std::endl;
    // output negative elements
    std::vector <int> :: iterator it;
    std::cout << "Negative elements: ";
    /*
    а тут зацикливалось
    while ( (it=std::find_if (vec.begin(), vec.end(), neg_el) ) != vec.end())
    */
    for ( it = std::find_if(vec.begin(), vec.end(), neg_el); it != vec.end(); it = std::find_if(++it, vec.end(), neg_el) )
        std::cout << *it << " ";
    std::cout << std::endl;
 
    // system ("pause");
    return 0;
}
Yandex
Объявления
07.06.2010, 18:10     Обращение к определенному элементу списка.
Ответ Создать тему
Опции темы

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