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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.67
tihonya
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 107
#1

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

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

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

То есть с двумерными массивами понятно Matrix[номер строки] [номер элемента]=значение; А вот с контейнерами библиотеки шаблонов возникают вопросы, при том, что если размер матрицы не соответствует(меньше) адресуемого элемента, то нужно создать(хотя бы выделить память) все элементы до адресуемого элемента.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.08.2012, 20:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Библиотека STL, + задача с её использованием (C++):

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

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

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

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

Библиотека шаблонов STL - C++
Здравствуйте, как можно сформировать массив множеств ptr, который формируется из строки str = &quot;the best way of doing something well&quot;, а ptr...

Библиотека STL, класс вектор - C++
Помогите написать прогу... вот задание: Использовать класс vector библиотеки STL для хранения каталога книг. Книги характеризуются...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Invader_Zim
Twilight Parasite
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
31.08.2012, 20:54 #2
tihonya, заполняеш вектор строку, и пушиш его в вектор столбец
Nick Alte
Эксперт С++
1636 / 1008 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
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
tihonya
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 107
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????
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
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 не реализует стандартв полной мере (по стандарту по дефолту используется '=')
tihonya
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 107
31.08.2012, 21:48  [ТС] #6
Цитата Сообщение от ForEveR Посмотреть сообщение
Ну че тут сказать. MSVC 2010 не реализует стандартв полной мере (по стандарту по дефолту используется '=')
Я наверно глупый, но я не понял нечего из вышесказанного. ((
Если не так то как должно быть??? (22 строка)?
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
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 поставить =.
nameless
Эксперт C++
334 / 298 / 14
Регистрация: 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);
   }
);
tihonya
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 107
31.08.2012, 23:26  [ТС] #9
Это конечно работает.
Все равно немного непонятно как реализовать функцию add ? То есть я не совсем понимаю, что происходит в алгоритме "for_each" и дальше. (я знаю для чего предназначен этот алгоритм).

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

Мне нужно понять и разобраться.
I.M.
564 / 547 / 5
Регистрация: 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;
}
или нужно, чтобы матрица всегда оставалась прямоугольной?
alsav22
5417 / 4813 / 442
Регистрация: 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;
}
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
01.09.2012, 00:43 #14
Цитата Сообщение от tihonya Посмотреть сообщение
Мне не так важно вектор это или множество set, или любой другой контейнер, мне главное понять как оно работает, и писать в дальнейшем программы с помощью библиотеки STL, и для этого я пишу этот пример. Какой другой контейнер лучше использовать? и почему?
Ну может тогда тебе стоит взять другой пример, в котором vector (или другой контейнер STL) был бы более удобен!?
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
01.09.2012, 01:00 #15
lazybiz, А чем здесь плох тот же std::array? Да и вектор здесь впринципе нормально подходит.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.09.2012, 01:00
Привет! Вот еще темы с ответами:

Стандартная библиотека шаблонов (STL) - C++
Пожалуйста,помогите решить.. Написать программу, которая использует класс string для анализа строки, содержащей математическое...

Библиотека STL, класс ЛИСТ - C++
Прив Всем! Нужна помощь... вот задание: ========================================================================== Используй класс...

Работа с файлами С++. Библиотека STL - C++
Пожалуйста, подскажите. Файл читает только одну строку, а в файле больше. Пример : Петров Петр Петрович 10 11 68 Иванов Иван...

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
01.09.2012, 01:00
Ответ Создать тему
Опции темы

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