C++ и файловый ввод-вывод C

HashSet работает над алгоритмом хеширования,

Так что, если у вас есть два набора String , которые содержат одинаковое значение, тогда хеш-код этого набора всегда будет одинаковым (поскольку String имеет специальное распределение в Яве).

Так что вы можете попробовать, как показано ниже.

    List<Set<String>> tmp = new ArrayList<Set<String>>();
    tmp.add(new HashSet<>(Arrays.asList(new String[]{"A","B","C"})));
    tmp.add(new HashSet<>(Arrays.asList(new String[]{"B","A","C"})));
    tmp.add(new HashSet<>(Arrays.asList(new String[]{"C","D","E"})));
    tmp.add(new HashSet<>(Arrays.asList(new String[]{"E","C","D"})));

    List<Set<String>> list =new ArrayList<>();

    for(Set<String> s: tmp){
        if(!list.contains(s)){
            list.add(s);
        }
    }
    System.out.println(list);

Результат будет похож на

[[A, B, C], [C, D, E]]
7
задан Yamaneko 17 August 2012 в 15:29
поделиться

8 ответов

Мнение

Я не знаю ни о каком реальном проекте, который использует потоки C++. Они являются слишком медленными и трудными использовать. Существует несколько более новых библиотек как FastFormat и версия Повышения, которые утверждают, что были лучше была часть в последнем журнале ACCU Overload о них. Лично я пользовался c библиотекой FILE в течение прошлых 15 лет или так в C++, и я не вижу причины все же для изменения.

Скорость

Вот маленькая тестовая программа (я наспех сколачиваю быстро) для показа основной проблемы скорости:

#include <stdio.h>
#include <time.h>

#include<iostream>
#include<fstream>

using namespace std;

int main( int argc, const char* argv[] )
    {
    const int max = 1000000;
    const char* teststr = "example";

    int start = time(0);
    FILE* file = fopen( "example1", "w" );
    for( int i = 0; i < max; i++ )
        {
        fprintf( file, "%s:%d\n", teststr, i );
        }
    fclose( file );
    int end = time(0);

    printf( "C FILE: %ds\n", end-start );

    start = time(0);
    ofstream outdata;
    outdata.open("example2.dat");
    for( int i = 0; i < max; i++ )
        {
        outdata << teststr << ":" << i << endl;
        }
    outdata.close();
    end = time(0);

    printf( "C++ Streams: %ds\n", end-start );

    return 0;
    }

И результаты на моем ПК:

C FILE: 5s
C++ Streams: 260s

Process returned 0 (0x0)   execution time : 265.282 s
Press any key to continue.

Поскольку мы видим просто, что этот простой пример 52x медленнее. Я надеюсь, что существуют способы сделать его быстрее!

Примечание: изменение endl к '\n' в моем примере улучшилось, потоки C++, делающие его только 3x медленнее, чем ФАЙЛ* потоки (благодарит jalf) могут быть способы сделать его быстрее.

Трудность использовать

Я не могу утверждать, что printf () не является кратким, но это более гибко (IMO) и более просто понять, после того как Вы заканчиваете начальный WTF для макро-кодов.

double pi = 3.14285714;

cout << "pi = " << setprecision(5)  << pi << '\n';
printf( "%.5f\n", pi );

cout << "pi = " << fixed << showpos << setprecision(3) << pi << '\n'; 
printf( "%+.3f\n", pi );

cout << "pi = " << scientific << noshowpos << pi<< '\n';
printf( "%e\n", pi );

Вопрос

Да, может ли быть существует потребность лучшей библиотеки C++, многие быть FastFormat то, что библиотека, только время покажет.

dave

15
ответ дан 6 December 2019 в 04:59
поделиться

Ссылка переполнения буфера походит на большую победу для C++ мне.

8
ответ дан 6 December 2019 в 04:59
поделиться

Взгляните на

http://www.ddj.com/cpp/184403651

затем Вы предпочтете C++ ввод-вывод, чем ввод-вывод C.

в коротком C предпочтен, если Вы знаете размер данных до чтения или записи и для скорости. C++ предпочтен, если Вы не знаете размера данных и для эффективного кода.

7
ответ дан 6 December 2019 в 04:59
поделиться

станд.:: ifstream и станд.:: ofstream уже находятся в stl библиотеке. Вы не должны создавать свое собственное.

Основное преимущество является всеми выводами, и исходные данные являются безопасностью типов.

1
ответ дан 6 December 2019 в 04:59
поделиться

C и C++ являются двумя различными языками. Файл C++ io занимает время, привыкая к, но после того как Вы используете алгоритмы, исключения и т.д., они имеют тенденцию вставать на свое место очень естественно.

1
ответ дан 6 December 2019 в 04:59
поделиться

Различия в производительности между printf ()/fwrite разрабатывают ввод-вывод и C++, потоковое форматирование IO является очень зависящим от реализации. Некоторые реализации (Visual C++, например), создайте их потоки IO сверху ФАЙЛА * объекты, и это имеет тенденцию увеличивать сложность во время выполнения их реализации. Обратите внимание, однако, что не было никакого конкретного ограничения для реализации библиотеки этим способом.

По моему собственному мнению, преимуществам C++ ввод-вывод следующие:

  • Безопасность с точки зрения типов, как уже указано ранее.
  • Гибкость реализации. Код может быть написан, чтобы сделать определенное форматирование или ввести к или от универсального ostream или объекта istream. Приложение может затем вызвать этот код с любым видом полученного потокового объекта. Если код, который я написал и протестировал против файла теперь, должен быть применен к сокету, последовательному порту или некоторому другому виду внутреннего потока, можно создать потоковую реализацию, характерную для такого ввода-вывода. При расширении стиля C ввод-вывод этим способом даже не близко к возможному.
  • Гибкость в настройках локали: подход C использования единственной глобальной локали, по-моему, серьезно испорчен. Я испытал случаи, где я вызвал код библиотеки (DLL), который изменил глобальные настройки локали под моим кодом и полностью испортил мой вывод. Поток C++ позволяет Вам пропитывать () любую локаль к потоковому объекту.
2
ответ дан 6 December 2019 в 04:59
поделиться

В ответ на ответ David Allan Finch я зафиксировал ошибку в его коде сравнительного тестирования (он сбросил поток в версии C++ после каждой строки), и повторно выполнил тест:

Цикл C++ теперь похож на это:

start = time(0);
{
    ofstream outdata("example2.txt");
    for( int i = 0; i < max; i++ )
    {
        outdata << teststr << ":" << i << "\n"; // note, \n instead of endl
    }
}
end = time(0);

Я выполняю 10 000 000 повторений (в 10 раз больше, чем в исходном коде, потому что иначе, числа являются просто слишком небольшими в течение времени () паршивое разрешение, чтобы дать нам что-либо значимое)), И вывод:

G++ 4.1.2:
C FILE: 4s
C++ Streams: 6s

MSVC9.0:
C FILE: 10s
C++ Streams: 23s

(отметьте, версия MSVC была выполнена на моем ноутбуке со значительно более медленным жестким диском),

Но это дает нам различие в производительности 1.5-2.3x, в зависимости от реализации. и другие внешние факторы.

7
ответ дан 6 December 2019 в 04:59
поделиться

Партии. Недостатки также. Посмотрите язык C++ FAQ для деталей. Короче говоря: безопасность типов и пользовательские типы.

0
ответ дан 6 December 2019 в 04:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: