11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 113
1

Библиотека STL, + задача с её использованием

31.08.2012, 20:18. Показов 6267. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток, о существовании библиотеки шаблонов я узнал 2 недели назад.
У меня есть задача:
Использовать ООП:
Написать программу, которая разгадывает японский кроссворд под названием "Судоку". Пользователь вводит начальные значения уже существующие в кроссворде, который необходимо разгадать, и программа выдает на экран готовый результат.
Но это глобальная задача, вопрос проще как грамотно заполнять матрицу
C++
1
vector < vector <int> > Matrix;
если входящие значение инт.

То есть с двумерными массивами понятно Matrix[номер строки] [номер элемента]=значение; А вот с контейнерами библиотеки шаблонов возникают вопросы, при том, что если размер матрицы не соответствует(меньше) адресуемого элемента, то нужно создать(хотя бы выделить память) все элементы до адресуемого элемента.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.08.2012, 20:18
Ответы с готовыми решениями:

Библиотека STL
Есть у кого задачи решенные по библиотеке STL с блок схемой, очень нужно!

Библиотека STL
Добрый вечер, очень нуждаюсь в Вашей помощи. Пропустила тему и теперь не успеваю в ней раобраться.....

библиотека STL
Подскажите где можно почитать про библиотеку STL. Говорю сразу с английским не дружу((

Стандартная библиотека C++ и STL
Вот нашел такие строки в книге Эккеля &quot;Философия С++&quot; В частности например класс vector автор...

19
Twilight Parasite
154 / 150 / 7
Регистрация: 21.07.2011
Сообщений: 908
31.08.2012, 20:54 2
tihonya, заполняеш вектор строку, и пушиш его в вектор столбец
0
Эксперт С++
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
31.08.2012, 20:57 3
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 <vector>
using std::vector;
 
#include <algorithm>
using std::for_each;
using std::copy;
 
#include <iostream>
using std::cout;
using std::endl;
 
#include <iterator>
using std::ostream_iterator;
 
 
#include <cstddef>
 
int main()
{
    const size_t w = 9, h=9;
    vector<vector<int>> Matrix(h);
    for_each(Matrix.begin(), Matrix.end(), [] (vector<int> &row) {row.resize(w);});
    for(size_t r=0; r<h; ++r)
        for(size_t c=0; c<w; ++c)
            Matrix[r][c] = 1 + c + r*w;
    for_each(Matrix.cbegin(), Matrix.cend(), [] (const vector<int> &row) 
        {copy(row.begin(), row.end(), ostream_iterator<int>(cout, "\t"));  cout<< endl;}
    );
}
На LiveWorkspace
0
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 113
31.08.2012, 21:34  [ТС] 4
Nick Alte, ошибка в 22-й строке:
Error 1 error C3493: 'w' cannot be implicitly captured because no default capture mode has been specified c:\users\toha\documents\visual studio 2010\projects\dddddd\dddddd\main.cpp 22


Ладно придется кидать код:
SudokuItem.h
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
#include "stdafx.h"
#pragma once
typedef void (*Action)(void);
class SudokuItem
{
    int *value;
    Action action;
public:
 
    SudokuItem(int value , Action act): action(act)
    {
        this->value=new int; *this->value=value;
    }
 
    int & getValue(){
        return *value;
    }
 
    void operator ()(){
        action();
    }
 
/*  ~SudokuItem(void)
    {
    }
    */
};
SudokuPole.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#pragma once
#include "SudokuItem.h"
class SudokuPole
{
    HANDLE console;
    vector < vector<SudokuItem> > Matrix;
public:
//  void add();
        void add(int * num, Action action);
    void operator ()();
    
 
    void drow(vector<SudokuItem>::iterator);
    SudokuPole(void);
    ~SudokuPole(void);
};
SudokuPole.cpp
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include "SudokuPole.h"
 
 
SudokuPole::SudokuPole(void)
{
    console=GetStdHandle(STD_OUTPUT_HANDLE);
 
}
    void SudokuPole::drow(vector<SudokuItem>::iterator selected){
    system ("cls");
        vector< vector<SudokuItem> >::iterator it=this-> Matrix.begin();
        vector<SudokuItem> ::iterator itin=this-> Matrix.begin()->begin();
        do
        {
            itin=it->begin();
            do {
            if (itin==selected)
            SetConsoleTextAttribute(console, FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY);
        else
            SetConsoleTextAttribute(console, FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_INTENSITY);
            cout<<itin->getValue();
        itin++;
}
        while(itin!=it->end());
        cout<<endl;
        it++;
        }while(it!=Matrix.end());
    }
/*void SudokuPole::add(){
 
        }*/
 
void SudokuPole::add(int * num, Action action){
 
        }
 
void SudokuPole::operator()()
{
    vector< vector<SudokuItem> >::iterator& it=this->Matrix.begin();
    vector<SudokuItem>::iterator& itin=this->Matrix.begin()->begin();
 
    while(true)
    {
        drow(itin);
        int code=getch();
        switch(code)
        {
        case 27:
            return;
        case 13:
            system ("cls");
    //      it->getAction()();
            itin->operator()();
            system("pause");
            break;
        case 75:
            if(it!=this->Matrix.begin())
            it--;
            break;
        case 77:
            {
            vector<SudokuItem>::iterator
                tmp(itin);
            tmp++;
            if(tmp!=it->end())
                itin++;
            }
            break;
        case 72:
            if(it!=Matrix.begin())
            it--;
            break;
        case 80:
            {
            vector< vector<SudokuItem> >::iterator
                tmp(it);
            tmp++;
            if(tmp!=Matrix.end())
                it++;
            break;
            }
 
        }
    }
}
 
SudokuPole::~SudokuPole(void)
{
}
Еще раз, как сделать функцию add????
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
31.08.2012, 21:44 5
tihonya,
Error 1 error C3493: 'w' cannot be implicitly captured because no default capture mode has been specified c:\users\toha\documents\visual studio 2010\projects\dddddd\dddddd\main.cpp 22
Ну че тут сказать. MSVC 2010 не реализует стандартв полной мере (по стандарту по дефолту используется '=')
0
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 113
31.08.2012, 21:48  [ТС] 6
Цитата Сообщение от ForEveR Посмотреть сообщение
Ну че тут сказать. MSVC 2010 не реализует стандартв полной мере (по стандарту по дефолту используется '=')
Я наверно глупый, но я не понял нечего из вышесказанного. ((
Если не так то как должно быть??? (22 строка)?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
31.08.2012, 21:49 7
tihonya,
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 <vector>
using std::vector;
 
#include <algorithm>
using std::for_each;
using std::copy;
 
#include <iostream>
using std::cout;
using std::endl;
 
#include <iterator>
using std::ostream_iterator;
 
 
#include <cstddef>
 
int main()
{
    const size_t w = 9, h=9;
    vector<vector<int>> Matrix(h);
    for_each(Matrix.begin(), Matrix.end(), [w] (vector<int> &row) {row.resize(w);});
    for(size_t r=0; r<h; ++r)
        for(size_t c=0; c<w; ++c)
            Matrix[r][c] = 1 + c + r*w;
    for_each(Matrix.cbegin(), Matrix.cend(), [] (const vector<int> &row) 
        {copy(row.begin(), row.end(), ostream_iterator<int>(cout, "\t"));  cout<< endl;}
    );
}
Ну или в capture вместо w поставить =.
0
Эксперт С++
342 / 306 / 36
Регистрация: 16.06.2009
Сообщений: 486
31.08.2012, 21:49 8
tihonya,
C++
1
2
3
4
5
6
7
std::for_each(
   Matrix.begin(),
   Matrix.end(), 
   [=](vector <int> & row) {
      row.resize(w);
   }
);
0
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 113
31.08.2012, 23:26  [ТС] 9
Это конечно работает.
Все равно немного непонятно как реализовать функцию add ? То есть я не совсем понимаю, что происходит в алгоритме "for_each" и дальше. (я знаю для чего предназначен этот алгоритм).

Если можно, кто шарит, на словах пояснить что его делать? (Чтоб принимались адрес ячейки(x,y)(или просто х (тогда push_back()) , и само значение ячейки), И в результате заполнялась матрица???
То есть если просто вектор, одномерный , то достаточно и этого:
C++
1
    Matrix.push_back(SudokuItem(name,action));
Нежен аналог для двухмерного вектора...
Зы: простите если туплю....
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
31.08.2012, 23:35 10
не повезло тебе с примером. вектор удобен там, где заранее неизвестно, сколько элементов он будет содержать, или их количество будет меняться "по ходу дела".
а зачем это городить в судоку - непонятно.
или отвлекись от судоку, или от векторов.
иначе получится "как можно с помощью калаэдра забить/извлечь гвоздь".
0
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 113
31.08.2012, 23:39  [ТС] 11
novi4ok, Мне не так важно вектор это или множество set, или любой другой контейнер, мне главное понять как оно работает, и писать в дальнейшем программы с помощью библиотеки STL, и для этого я пишу этот пример. Какой другой контейнер лучше использовать? и почему?

Мне нужно понять и разобраться.
0
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
31.08.2012, 23:59 12
Может что-то не так понял, но из вышесказанного функцию add вижу как-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class matrix
{
public:
    void add(int x, int y, int value);
 
private:
    std::vector<std::vector<int>> data_;
};
 
void matrix::add(int x, int y, int value)
{
    if(x < 0 || y < 0)return;
 
    if(data_.size() <= x)data_.resize(x+1);
    if(data_[x].size() <=  y)data_[x].resize(y+1);
 
    data_[x][y] = value;    
    return;
}
или нужно, чтобы матрица всегда оставалась прямоугольной?
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
01.09.2012, 00:33 13
Цитата Сообщение от tihonya Посмотреть сообщение
Мне нужно понять и разобраться.
В чём конкретно? Если просто: что такое STL и как с ней работать, то обращайтесь к литературе. Если, как можно заполнить матрицу используя vector, то можно так:
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
#include <string>
#include <vector>
#include <cstdlib>
using namespace std;
 
int main()
{
    vector <vector <int> > Matrix;
    
    const int N = 3;
    
    for (int i = 0; i < N; i++)
    {
        vector <int> temp;
        for (int i = 0; i < N; i++)
        {
            int a;
            cin >> a;
            temp.push_back(a);
        }
        Matrix.push_back(temp);
    }
    
    vector <vector <int> >::iterator itVecInt;
    vector <int>::iterator itInt;
    
    for (itVecInt = Matrix.begin(); itVecInt != Matrix.end(); itVecInt++)
    {
        for (itInt = (*itVecInt).begin(); itInt != (*itVecInt).end(); itInt++)
                cout << *itInt << " ";
        cout << endl;
    }
    
  system("pause");
  return 0;
}
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
01.09.2012, 00:43 14
Цитата Сообщение от tihonya Посмотреть сообщение
Мне не так важно вектор это или множество set, или любой другой контейнер, мне главное понять как оно работает, и писать в дальнейшем программы с помощью библиотеки STL, и для этого я пишу этот пример. Какой другой контейнер лучше использовать? и почему?
Ну может тогда тебе стоит взять другой пример, в котором vector (или другой контейнер STL) был бы более удобен!?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
01.09.2012, 01:00 15
lazybiz, А чем здесь плох тот же std::array? Да и вектор здесь впринципе нормально подходит.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
01.09.2012, 01:15 16
ForEveR, я не сказал что он плох. Я хотел сказать что для человека, который начал изучать STL, было бы проще начать с примера попроще.
1
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
01.09.2012, 01:30 17
не в попроще дело. у судоку - матрица 12х12. все.
C++
1
char sudoku_field [9][9];
и больше ничего не нужно (вроде бы. у меня, кстати, есть такая судоку-решачка на c#, так контейнеров у меня там - три. один хранит горизонтальные "совокупности", один - вертикальные, один - 3х3-шные.

неудачный пример судоку для освоения stl, продолжаю считать. для изучения подходят примеры, позволяющие сосредоточиться именно на удачном выборе, скажем, вектора для решения данной задачи. а здесь - никакого преимущества.

Добавлено через 7 минут
Цитата Сообщение от tihonya Посмотреть сообщение
novi4ok, Мне не так важно вектор это или множество set, или любой другой контейнер, мне главное понять как оно работает, и писать в дальнейшем программы с помощью библиотеки STL, и для этого я пишу этот пример. Какой другой контейнер лучше использовать? и почему?

Мне нужно понять и разобраться.
предстась себе, что ты с помощью некой ф-ии
C++
1
int next();
получаешь некое сообщение, имеющее формат:
int - количество элементов
за ним - n int элементов. тебе нужно их принять, сохранить, и затем ответить на запросы типа "выдай среднее", "выдай наименьшее", "выдай наибольшее" и т.д. вот здесь вектор был бы очень удобен. ты заранее не знаешь, сколько элементов будет в сообщении, и использование массива не так удобно было бы.
set - другой тип контейнера, map, multimap, list, queue и прочая команда. почитай:

http://www.cplusplus.com/reference/stl/
1
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 113
01.09.2012, 22:13  [ТС] 18
Цитата Сообщение от I.M. Посмотреть сообщение
или нужно, чтобы матрица всегда оставалась прямоугольной?
Я уже завтра посмотрю на этот вариант, попробую присандалить.

Цитата Сообщение от alsav22 Посмотреть сообщение
В чём конкретно? Если просто: что такое STL и как с ней работать, то обращайтесь к литературе.
Разобраться в поведении сущностей этой библиотеки, и понимать каждую из них как тип данных инт, или указатель и тд, также пользоватся.
Чтоб выучить любой язык программирования нужно писать на нем программы, я не знаю другого пути. Есть вещи которые не получается выучить по литературе, но я без условно к ней обращаюсь. Все и сразу выучить не могу, но по мере скромных сил стараюсь...

Буду отписывается об успехах с этой задачей в этой теме.

novi4ok, Ссылка интересная, запомнил буду листать.

Мне хочется верить, что я напишу ещё не один пример с использованием STL, и не важно удачный он или не удачный.... Пока есть этот.

Добавлено через 20 часов 43 минуты
Продолжу с этим примером:
Приведенный ниже код уже компилируется,
проблема 1) оно осуществляет вывод матрицы, отмечает цветом выделенный элемент и перемещает цветовой маркер только вправо, как мне доработать(исправить) код чтоб маркер перемещался по всему размеру матрицы?(верх, вниз, право, лево).


SudokuItem.h
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 "stdafx.h"
#pragma once
typedef void (*Action)(void);
class SudokuItem
{
    int *value;
    Action action;
 
public:
 
    SudokuItem(){ this->value=new int;}
    SudokuItem(int value , Action act): action(act)
    {
        this->value=new int; *this->value=value;
    }
 
    int & getValue(){
        return *value;
    }
 
    void operator ()(){
        action();
    }
 
/*  ~SudokuItem(void)
    {
    }
    */
};
SudokuPole.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#pragma once
#include "SudokuItem.h"
class SudokuPole
{
    HANDLE console;
    vector < vector<SudokuItem> > Matrix;
public:
//  void add();
        void add(int x, int y,int * num, Action action);
    void operator ()();
    
 
    void drow(vector<SudokuItem>::iterator);
    SudokuPole(void);
    ~SudokuPole(void);
};
SudokuPole.cpp
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include "SudokuPole.h"
 
SudokuPole::SudokuPole(void)
{
    console=GetStdHandle(STD_OUTPUT_HANDLE);
}
    void SudokuPole::drow(vector<SudokuItem>::iterator selected){
    system ("cls");
    int s=0;
        vector< vector<SudokuItem> >::iterator it=this-> Matrix.begin();
 
        do
        {
        vector<SudokuItem> ::iterator itin=it->begin();
            do {
 
                if (itin._Ptr==selected._Ptr){
            SetConsoleTextAttribute(console, FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY);
 
            }
        else
    
            SetConsoleTextAttribute(console, FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_INTENSITY);
            cout<<itin->getValue();
        itin++;
}
        while(itin!=it->end());
        cout<<endl;
        it++;
        }while(it!=Matrix.end());
}
/*void SudokuPole::add(){
 
        }*/
 
void SudokuPole::add(int x, int y,int * num, Action action){
        if(x < 0 || y < 0)return;
 
    if(Matrix.size() <= x)Matrix.resize(x+1);
    if(Matrix[x].size() <=  y)Matrix[x].resize(y+1);
    SudokuItem tmp(*num,action);
    Matrix[x][y] =tmp;    
    return;
        }
 
void SudokuPole::operator()()
{
    vector< vector<SudokuItem> >::iterator& it=this->Matrix.begin();
    vector<SudokuItem>::iterator& itin=this->Matrix.begin()->begin();
 
    while(true)
    {
        drow(itin);
        int code=getch();
        switch(code)
        {
        case 27:
            return;
        case 13:
            system ("cls");
    //      it->getAction()();
            itin->operator()();
            system("pause");
            break;
        case 75:
            if(it!=this->Matrix.begin())
            it--;
            break;
        case 77:
            {
            vector<SudokuItem>::iterator
                tmp(itin);
            tmp++;
            if(tmp!=it->end())
                itin++;
            }
            break;
        case 72:
            if(it!=Matrix.begin())
            it--;
            break;
        case 80:
            {
            vector< vector<SudokuItem> >::iterator
                tmp(it);
            tmp++;
            if(tmp!=Matrix.end())
                it++;
            break;
            }
 
        }
    }
}
 
SudokuPole::~SudokuPole(void)
{
}
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "stdafx.h"
#include"SudokuPole.h"
void f(){
    cout<<"\nAction\n";
}
 
void main(){
    int d=0;
    SudokuPole pole;
    for (int i=0;i<10;i++)
        for(int j=0;j<10;j++){
            pole.add(i,j,&d,f);
        }
    pole();
}
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
02.09.2012, 01:26 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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
void SudokuPole::operator()()
{
    vector< vector<SudokuItem> >::iterator &it = this -> Matrix.begin();
    vector<SudokuItem>::iterator &itin = this -> Matrix.begin() -> begin();
 
    while(true)
    {
       drow(itin);
       int code = getch();
       switch(code)
       {
          case 27:
             return;
          
          case 13:
          {
             system ("cls");
    //       it->getAction()();
             itin -> operator()();
             system("pause");
          }
          break;
          
          case 75: // шаг влево
          {
             if(itin != it -> begin())
                itin--;
          }
          break;
          
          case 77: // шаг вправо
          {
              if(itin != it -> end() - 1)
                itin++;
          } 
          break;
           
          case 72: // на строку вверх
          { 
              int i = itin - (it ->begin()); // запоминаем положение от начала строки
              if(it != Matrix.begin())
              {
                 it--;
                 itin = (it ->begin() + i); // восстанавливаем положение от начала на новой строке
              }
           } 
           break;
            
           case 80: // на строку вниз
           {
              int i = itin - (it ->begin()); // запоминаем положение от начала строки
              if(it != Matrix.end() - 1)
              {
                 it++;
                 itin = (it ->begin() + i); // восстанавливаем положение от начала на новой строке
              }
            }
            break;
        }
    }
}
1
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
02.09.2012, 08:44 20
for_each от лукавого.
0
02.09.2012, 08:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.09.2012, 08:44
Помогаю со студенческими работами здесь

Библиотека шаблонов STL
Здравствуйте, как можно сформировать массив множеств ptr, который формируется из строки str = &quot;the...

Библиотека STL, сортировка
Сортировка слов по количеству вхождений в слово его первой буквы... Можно какой-нибудь пример?? ...

Библиотека стандартных шаблонов STL
1. Создайте пустой целочисленный вектор и поместите в него 10 случайных чисел с интервалом значений...

библиотека STL, гарантированное планирование
всем превед, траблы вот в чем, не могу удалить элемент контейнера vector с помощью erase критует, с...


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

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

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