Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.79/165: Рейтинг темы: голосов - 165, средняя оценка - 4.79
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
1

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

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

Author24 — интернет-сервис помощи студентам
Сабж.
К примеру, имеется список:
C++
1
list <int> L;
И есть цикл:
C++
1
2
3
list <int>::iterator i;
    for (i=L.begin() ; i!=L.end() ; i++) {
        // и вот тут, как мне обратится к i-ому элементу списка?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.05.2010, 16:05
Ответы с готовыми решениями:

Обращение к n-му элементу списка
Дана структура односвязных списков, осталось дописать функцию обращения к определённому элементу...

Обращение к элементу списка структур
Привет всем! Начал изучать списки в С++. Создал список структур, но не знаю как правильно...

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

Обращение к определённому элементу в столбце
У нас есть столбец значений. Можно ли последовательно получать через SELECT значение каждого...

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

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

Добавлено через 2 минуты
И конечно буду сильно благодарен за хорошую литературу.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
18.05.2010, 17:47 17
Цитата Сообщение от neske Посмотреть сообщение
В каком направлении мне идти, если моя задача научится делать элементарные программы, но с пользовательским интерфейсом?
Я бы Qt посоветовал. Сам освоить пытаюсь, правда, не легко пока даётся. И с книжками засада. Единственная бумажная, которую нашёл (ну люблю я бумажные книжки) - Ю. Земсков "Qt 4 на примерах". Не очень хорошая книжка - сумбурно всё как-то, и многие примеры мягко говоря сомнительно написаны. За то в самом Qt помощь не плохо сделана - при желании можно разобраться...
1
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
19.05.2010, 15:06  [ТС] 18
Спасибо.
А что на счет литературы из этой темы, может быть кто-нибудь пользовался? (в конце)
https://www.cyberforum.ru/cpp-... 79698.html
0
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
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
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.06.2010, 18:10
Помогаю со студенческими работами здесь

Обращение к определенному элементу в иерархии объекта по строке
Суть такова: есть глобальный объект с очень объемной многоуровневой иерархией дочерних объектов,...

Как присвоить class определенному элементу списка?
Доброе время суток! Помогите пожалуйста решить задачу. Есть простой список из n-го количества...

Обращение к определенному полю списка из запроса
Добрый день! Пользую Access 2007. Надо в запросе обратиться ко второй колонке поля со списком на...

Как обратится к определенному элементу односвязного списка под номером n?
Подскажите пожалуйста как в односвязном списке обратится к определенному элементу под номером n....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru