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

generate() и equal() - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 5.00
Gordex
0 / 0 / 0
Регистрация: 08.03.2011
Сообщений: 7
08.03.2011, 23:39     generate() и equal() #1
доброго всем времени суток!
взялся помочь знакомому решить задачу на с++, но видимо немного не рассчитал свой уровень.
задача- реализовать чтение строк из двух файлов и вывести строки, которые встречаются в обоих файлах (совпадающие). это я сделал, однако обязательное условие задачи- использовать generate() и equal(). по generate я нашёл слишком мало информации, что бы разобраться. а то, что я нашёл об equal подсказывает мне, что нужно было работать с векторами, а не с динамическими массивами.
вот код:
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
#include <iostream> //потоки ввода- вывода
#include <fstream> 
//#include <algorithm> //для generate
#include <string>
#include <conio.h>//для getch
//#include <vector>
 
using namespace std; //пространство имён 
/*--------функция определения количества строк в файле----------------------*/
int CountStrings(istream& is)
{
  if (!is.good())
     return 0;
 
  string s;
  int nStrings = 0;
  while ( std::getline(is, s))
      ++nStrings;
 
  return nStrings;
}
/*-----------------------------*/
 
void main()
{
    /*определяем количество строк в файлах, создаем динамические массивы для каждого из файлов.*/
    ifstream input_file1("1.txt");
    ifstream input_file2("2.txt");
    int num1 = CountStrings(input_file1); //количество строк в первом файле
    int num2 = CountStrings(input_file2); //кол-во строк во втором файле
    string *arr1 = new string[num1]; //массив первого файла
    string *arr2 = new string[num2]; //массив строк из второго файла
/*теперь считываем информацию из каждого файла построчно в динамический массив*/
    input_file1.close();
    input_file1.open("1.txt");
    input_file2.close();
    input_file2.open("2.txt"); //переоткрыли файл для чтения
    
    string str; //буфер
    int i = 0; //счетчик
    while(getline(input_file1, str)) 
    {
        arr1[i] = str;
        i++;
    }
    input_file1.close();
 
    i = 0; //счетчик
 
    while(getline(input_file2, str)) 
    {
        arr2[i] = str;
        i++;
    }
    input_file2.close();
 
/*начало вывода*/
    for (i=0; i != num1; i++)
        for(int j = 0; j != num2; j++)
            if(arr1[i] == arr2[j])
            {
                cout << arr1[i] << endl;
            }
    getch();
/*конец*/
}
немного некрасиво написано, очень давно работал в студии последний раз.
прав ли я насчёт векторов? и что посоветуете с generate / equal? как мне кажется, в generate нужно считывать строки из файлов, только что-то не получается придумать, как это сделать)

Добавлено через 1 час 16 минут
очень рассчитываю на ваш совет (просто примера применения generate() и equal(), хотя бы отдаленно подходящего к данной ситуации, будет достаточно- я не прошу писать программу за меня).
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.03.2011, 23:39     generate() и equal()
Посмотрите здесь:

Lisp equal и equalp
generate () C++
Описать логическую функцию equal (l1,l2), проверяющую на равенство списки l1 и l2 C++
GPSS Переменные для GENERATE
Equal method - симетричность C#
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
08.03.2011, 23:57     generate() и equal() #2
ну последний кусок можно так переписать

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 <algorithm>
#include <cstdlib>
#include <ctime>
#include <vector>
#include <iterator>
 
const int N = 10;
 
int _gen()
{
  return rand() % 10;
}
 
int main()
{
  srand( time(0) );
  std::vector<int> v1(N),v2(N);
  std::generate( v1.begin(), v1.end(), _gen );
  std::generate( v2.begin(), v2.end(), _gen );
  std::copy( v1.begin(), v1.end(), std::ostream_iterator<int>( std::cout, " " ) );
    std::cout << std::endl;
  std::copy( v2.begin(), v2.end(), std::ostream_iterator<int>( std::cout, " " ) );
    std::cout << std::endl;
  std::vector<int>::iterator it1 = v1.begin();
  for( ; v1.end() != (it1 = std::find_first_of(it1,v1.end(),v2.begin(),v2.end())) ; ++it1)
  {
    std::cout << *it1 << std::endl;
  }
}
а где generate хотите?
Gordex
0 / 0 / 0
Регистрация: 08.03.2011
Сообщений: 7
09.03.2011, 00:28  [ТС]     generate() и equal() #3
generate хотелось бы задействовать при считывании строк из файла... можно так сделать? я просто не до конца понимаю, как он работает. уверен, что намного проще, чем мне кажется =) я не понимаю третий параметр- там может быть любая функция, возвращающая значение того же типа, что и вектор?

Добавлено через 2 минуты
alex_x_x, а std::vector<string> v1[num1] - так можно задать вектор строк размерностью num1? (num1 - количество строк в первом файле)
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
09.03.2011, 00:33     generate() и equal() #4
Gordex, не, там ничего простого не придумаешь
и вместо массивов здесь стоит использовать вектор скорее

Добавлено через 58 секунд
Цитата Сообщение от Gordex Посмотреть сообщение
я не понимаю третий параметр- там может быть любая функция, возвращающая значение того же типа, что и вектор?
да, но generate рассчитан скорее на случай когда будет известно кол-во считываемых элементов, тут же нет

Добавлено через 58 секунд
Цитата Сообщение от Gordex Посмотреть сообщение
std::vector<string> v1[num1] - так можно задать вектор строк размерность num1? (num1 - количество строк в первом файле)
(num1) это конструктор
с си переходите?
читайте про стл, на это стоит потратить время
Gordex
0 / 0 / 0
Регистрация: 08.03.2011
Сообщений: 7
09.03.2011, 10:25  [ТС]     generate() и equal() #5
alex_x_x, большое спасибо =)
перехожу... не знаю, не сказал бы) просто студию не люблю, обычно работаю в борланде. а в последнее время больше занимаюсь пхп и аяксом...
с векторами вроде разобрался, буду думать, как таки реализовать считывание в generate =)
по идее, нужно просто написать функцию заполнения вектора строками из файла. я пробовал, но с первого раза не получилось, и я ушёл спать вчера =)

Цитата Сообщение от alex_x_x Посмотреть сообщение
generate рассчитан скорее на случай когда будет известно кол-во считываемых элементов, тут же нет
т.е. переменная num1 мне тут не поможет? если нельзя использовать переменную в параметре (что мне кажется странным), то возможен вариант указания большого кол-ва считывания элементов (штук 100, к примеру), и в каждом проходе увеличивать счетчик итератором, пока он не станет равным этому самому num1.
кажется, таким образом я удалю гланды через ноздри)
сейчас на работе, вечером попробую сделать. напишу, что и как получится)
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
09.03.2011, 13:04     generate() и equal() #6
Можно как-нибудь так например

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
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <string>
 
struct reader
{
public:
    reader(std::ifstream& ifs2):ifs(ifs2)
    {
    }
    ~reader()
    {
        ifs.close();
    }
    std::string operator () () 
    {
        std::string res;
        if(!ifs.eof())
            std::getline(ifs, res);
        return res;
    }
private:
    std::ifstream& ifs;
};
 
int count_Strings(std::ifstream& ifs)
{
    std::string str;
    int count=0;
    while(std::getline(ifs, str))
        ++count;
    return count;
}
 
int main()
{
    std::vector<std::string> vec;
    std::ifstream ifs("input.txt");
    if(!ifs)
    {
        std::cerr<<"Error with opening file\n";
        return 1;
    }
    int cnt=count_Strings(ifs);
    ifs.close();
    std::ifstream ifs2("input.txt");
    if(!ifs2)
    {
        std::cerr<<"Error with opening file\n";
        return 1;
    }
    reader file(ifs2);
    vec.resize(cnt);
    std::generate_n(vec.begin(), cnt, file);
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
    return 0;
}
Gordex
0 / 0 / 0
Регистрация: 08.03.2011
Сообщений: 7
09.03.2011, 16:29  [ТС]     generate() и equal() #7
ForEveR, большое спасибо за ответ. все ещё на работе, поэтому нет возможности скомпилировать. но это как раз то, что я хотел. ближе к полуночи по московскому допишу и выложу программу, вдруг кому ещё пригодится.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
09.03.2011, 21:05     generate() и equal() #8
Еще вар... Но как с деструктором быть - хз. Должен бы удалять, но кидает ошибку.

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
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <string>
 
struct reader
{
public:
    reader(const std::string& str):ifs(new std::ifstream(str.c_str()))
    {
        //Обработка на открытие
    }
    ~reader()
    {
        ifs->close();
        //delete ifs;
    }
    std::string operator () () 
    {
        std::string res;
        if(!ifs->eof())
            std::getline(*ifs, res);
        return res;
    }
private:
    std::ifstream* ifs;
};
 
int count_Strings(std::ifstream& ifs)
{
    std::string str;
    int count=0;
    while(std::getline(ifs, str))
        ++count;
    return count;
}
 
int main()
{
    std::vector<std::string> vec;
    std::ifstream ifs("input.txt");
    if(!ifs)
    {
        std::cerr<<"Error with opening file\n";
        return 1;
    }
    int cnt=count_Strings(ifs);
    ifs.close();
    reader file("input.txt");
    vec.resize(cnt);
    std::generate_n(vec.begin(), cnt, file);
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
    return 0;
}
Gordex
0 / 0 / 0
Регистрация: 08.03.2011
Сообщений: 7
09.03.2011, 21:37  [ТС]     generate() и equal() #9
ForEveR, а в чём вы компилировали? у меня visual studio 2010 ругается на строчку
std::copy(vec.begin(), vec.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
мол ostream не является членом std

1>c:\labs\strings\test\main.cpp(53): error C2039: ostream_iterator: не является членом "std"
1>c:\labs\strings\test\main.cpp(53): error C2065: ostream_iterator: необъявленный идентификатор
1>c:\labs\strings\test\main.cpp(53): error C2275: std::string: недопустимое использование этого типа в качестве выражения
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
09.03.2011, 22:19     generate() и equal() #10
Gordex, #include <iterator>
Gordex
0 / 0 / 0
Регистрация: 08.03.2011
Сообщений: 7
09.03.2011, 22:20  [ТС]     generate() и equal() #11
alex_x_x, ой, спасибо =)
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
10.03.2011, 00:28     generate() и equal() #12
Совершенно непонятно, куда засунуть generate и equal.
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
#include <vector>
#include <string>
#include <iterator>
#include <iostream>
#include <fstream>
#include <algorithm>
 
void ReadLinesFromFile(std::ifstream &file,
                       std::vector<std::string> &lines) {
  std::string line;
  while (std::getline(file, line, '\n'))
    lines.push_back(line);
}
 
int main(int argc, char *argv[]) {
  std::vector<std::string> lines_one, lines_two, same_lines;
 
  std::ifstream file_one("tutor103.cc");
  std::ifstream file_two("tutor102.cc");
 
  ReadLinesFromFile(file_one, lines_one);
  ReadLinesFromFile(file_two, lines_two);
 
  std::vector<std::string>::iterator i, j;
  for (i = lines_one.begin(); i != lines_one.end(); ++i)
    if (find(lines_two.begin(), lines_two.end(), *i) != lines_two.end())
        same_lines.push_back(*i);
 
  std::copy(same_lines.begin(), same_lines.end(),
            std::ostream_iterator<std::string>(std::cout, "\n"));
 
  return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.03.2011, 01:33     generate() и equal()
Еще ссылки по теме:

Разница между == и Equal() C#
Generate Device Name Objective-C
Lisp Предикат EQUAL-SET

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

Или воспользуйтесь поиском по форуму:
Gordex
0 / 0 / 0
Регистрация: 08.03.2011
Сообщений: 7
10.03.2011, 01:33  [ТС]     generate() и equal() #13
мой вариант с equal, воспользовался одним из вариантов, предложенных ForEveR. пока все работает, думаю на зачёт парню хватит.
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
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <string>
#include <iterator>
#include <conio.h>
 
struct reader
{
public:
        reader(const std::string& str):ifs(new std::ifstream(str.c_str()))
        {
                //Обработка на открытие
        }
        ~reader()
        {
                ifs->close();
                //delete ifs;
        }
 
        std::string operator () () 
        {
                std::string res;
                if(!ifs->eof())
        std::getline(*ifs, res);
                return res;
        }
private:
        std::ifstream* ifs;
};
 
int count_Strings(std::ifstream& ifs)
{
        std::string str;
        int count=0;
        while(std::getline(ifs, str))
                ++count;
        return count;
}
 
bool predict (std::string i, std::string j)
{
    if(i == j)
        std::cout << i << std::endl;
    return i == j;
}
int main()
{
    /*------------------------------------------------------------------------------------------------*/
        std::vector<std::string> vec1;//вектор строк для первого файла
        std::ifstream ifs1("1.txt"); //открываем файл для подсчёта строка
        if(!ifs1)
        {
                std::cerr<<"Error with opening file\n";
                return 1; //обработка ошибки
        }
        int cnt=count_Strings(ifs1); //считаем количество строк
        ifs1.close();
        reader file("1.txt");
        vec1.resize(cnt);
        std::generate_n(vec1.begin(), cnt, file);
        std::cout << "first file: \n \n";
        std::copy(vec1.begin(), vec1.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
        ifs1.close();
    /*-----------------------------------------------------------------------------------------------------*/
    std::vector<std::string> vec2;//вектор строк для второго файла
    std::ifstream ifs2("2.txt"); //открываем файл для подсчёта строка
        if(!ifs2)
        {
                std::cerr<<"Error with opening file\n";
                return 1; //обработка ошибки
        }
        int cnt2=count_Strings(ifs2); //считаем количество строк
        ifs2.close();
        reader file2("2.txt");
        vec2.resize(cnt2);
        std::generate_n(vec2.begin(), cnt2, file2);
    std::cout << "\n \nsecond file: \n \n";
        std::copy(vec2.begin(), vec2.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
    ifs2.close();
 
    std::cout << std::endl << "equal strings:\n"<< std::endl;
 
    if (std::equal (vec1.begin(), vec1.end(), vec2.begin(), predict))
    {
        std::cout << std::endl << "all strings are equal"; //работает, только если ВСЕ строки равны
    }
    getch();
 
        return 0;
}
Добавлено через 2 минуты
Цитата Сообщение от lemegeton Посмотреть сообщение
Совершенно непонятно, куда засунуть generate и equal.
угу. мне кажется, очень странное условие для такой задачи. насколько я понял, этому учат в ИТМО (Санкт-Петербург).
Yandex
Объявления
10.03.2011, 01:33     generate() и equal()
Ответ Создать тему
Опции темы

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