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]]
Мнение
Я не знаю ни о каком реальном проекте, который использует потоки 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
Ссылка переполнения буфера походит на большую победу для C++ мне.
Взгляните на
http://www.ddj.com/cpp/184403651
затем Вы предпочтете C++ ввод-вывод, чем ввод-вывод C.
в коротком C предпочтен, если Вы знаете размер данных до чтения или записи и для скорости. C++ предпочтен, если Вы не знаете размера данных и для эффективного кода.
станд.:: ifstream и станд.:: ofstream уже находятся в stl библиотеке. Вы не должны создавать свое собственное.
Основное преимущество является всеми выводами, и исходные данные являются безопасностью типов.
C и C++ являются двумя различными языками. Файл C++ io занимает время, привыкая к, но после того как Вы используете алгоритмы, исключения и т.д., они имеют тенденцию вставать на свое место очень естественно.
Различия в производительности между printf ()/fwrite разрабатывают ввод-вывод и C++, потоковое форматирование IO является очень зависящим от реализации. Некоторые реализации (Visual C++, например), создайте их потоки IO сверху ФАЙЛА * объекты, и это имеет тенденцию увеличивать сложность во время выполнения их реализации. Обратите внимание, однако, что не было никакого конкретного ограничения для реализации библиотеки этим способом.
По моему собственному мнению, преимуществам C++ ввод-вывод следующие:
В ответ на ответ 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, в зависимости от реализации. и другие внешние факторы.
Партии. Недостатки также. Посмотрите язык C++ FAQ для деталей. Короче говоря: безопасность типов и пользовательские типы.