Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 36, средняя оценка - 4.89
neske
1527 / 894 / 192
Регистрация: 26.03.2010
Сообщений: 3,074
#1

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

11.05.2010, 16:05. Просмотров 6513. Ответов 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++):

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

Обращение к элементу массива
Объясните пожалуйста, что происходит в строке помеченной *** void main(){...

Обращение к элементу матрицы
как зделать операцию A template &lt;class T&gt; class matrix{ T **mat; int n,...

Обращение к элементу массива
Как мне обратиться к последнему элементу массива? например: Array // i = 0...

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

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

23
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,231
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
1527 / 894 / 192
Регистрация: 26.03.2010
Сообщений: 3,074
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Эксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,231
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
1527 / 894 / 192
Регистрация: 26.03.2010
Сообщений: 3,074
11.05.2010, 16:53  [ТС] #5
Спасибо, я понял.
А вообще, в примере, предложенном мною, как сделать? И вообще, можно ли?
Это мне так, для общего развития)
0
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,231
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
1527 / 894 / 192
Регистрация: 26.03.2010
Сообщений: 3,074
11.05.2010, 18:25  [ТС] #7
easybudda, спасибо еще раз
0
neske
1527 / 894 / 192
Регистрация: 26.03.2010
Сообщений: 3,074
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Эксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,231
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
1527 / 894 / 192
Регистрация: 26.03.2010
Сообщений: 3,074
16.05.2010, 21:53  [ТС] #10
Ясно, спасибо.
То есть имеется два способа?
-функция push_back (или аналогичные)
-функция assign
0
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,231
16.05.2010, 22:18 #11
Цитата Сообщение от neske Посмотреть сообщение
То есть имеется два способа?
Гораздо больше... std::copy(), std::generate(), std::fill() и куча их вариантов...
1
neske
1527 / 894 / 192
Регистрация: 26.03.2010
Сообщений: 3,074
16.05.2010, 22:32  [ТС] #12
Так, спасибо.
C++
1
/*name*/ (v.begin(), v.end(), rand()%10);
А такой вариант возможен?)
0
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,231
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
1527 / 894 / 192
Регистрация: 26.03.2010
Сообщений: 3,074
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Эксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,231
17.05.2010, 16:33 #15
neske, ага... только без самурайского смайла в хвосте
0
neske
1527 / 894 / 192
Регистрация: 26.03.2010
Сообщений: 3,074
18.05.2010, 17:13  [ТС] #16
Не хотел создавать новую тему, напишу тут.

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

Добавлено через 2 минуты
И конечно буду сильно благодарен за хорошую литературу.
0
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,231
18.05.2010, 17:47 #17
Цитата Сообщение от neske Посмотреть сообщение
В каком направлении мне идти, если моя задача научится делать элементарные программы, но с пользовательским интерфейсом?
Я бы Qt посоветовал. Сам освоить пытаюсь, правда, не легко пока даётся. И с книжками засада. Единственная бумажная, которую нашёл (ну люблю я бумажные книжки) - Ю. Земсков "Qt 4 на примерах". Не очень хорошая книжка - сумбурно всё как-то, и многие примеры мягко говоря сомнительно написаны. За то в самом Qt помощь не плохо сделана - при желании можно разобраться...
1
neske
1527 / 894 / 192
Регистрация: 26.03.2010
Сообщений: 3,074
19.05.2010, 15:06  [ТС] #18
Спасибо.
А что на счет литературы из этой темы, может быть кто-нибудь пользовался? (в конце)
http://www.cyberforum.ru/cpp-cross-platform/thread79698.html
0
neske
1527 / 894 / 192
Регистрация: 26.03.2010
Сообщений: 3,074
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 секунд
Программа зацикливается.
0
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,231
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;
}
1
07.06.2010, 18:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.06.2010, 18:10
Привет! Вот еще темы с решениями:

Приоритет. Обращение к элементу по постинкременту.
while(buffer != ',' &amp;&amp; buffer != '\0') dest=buffer; Вот такой код, вопрос...

Обращение к следующему элементу в for-each цикле
Как обратиться к следующему элементу for each цикла? Например, в цикле for...

Обращение к элементу массива из строк
Здравствуйте! Имеется такой код: string mesiaci = //Massiv iz strok { ...

Обращение к последнему элементу вектора
Здравствуйте, мне нужно сравнить последний элемент вектора с числом и в...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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