От http://www.cplusplus.com/reference/stl/vector/
Векторные контейнеры реализованы как динамические массивы; Так же, как эквидистантные антенные решетки векторным контейнерам сохранили их элементы в непрерывных местах хранения, что означает, что к их элементам можно получить доступ не только с помощью итераторов, но также и с помощью смещений на регулярных указателях к элементам.
, Но в отличие от эквидистантных антенных решеток, устройство хранения данных в векторах обрабатывается автоматически, позволяя этому быть расширенным и законтрактованным по мере необходимости.
, Кроме того, векторы могут обычно содержать любой объект - таким образом, можно сделать класс, чтобы содержать информацию о механизмах и затем сохранить флот в векторе.
Хорошие вещи о векторах, кроме изменения размеров, состоят в том, что они все еще предоставляют доступ в постоянное время к отдельным элементам через индекс, точно так же, как массив.
компромисс для изменения размеров, то, что при ударе токовой нагрузки, она должна перераспределить и иногда копировать в, больше памяти. Однако большинство полных алгоритмов увеличения удваивает способность каждый раз, когда Вы поражаете барьер, таким образом, Вы никогда не поражаете его больше, чем log2 (доступная "куча"), который оказывается, возможно, дюжину раз в худшем случае в течение операции программы.
-Adam
Вы можете рассматривать скалярную переменную как дескриптор файла, открыв
ее:
open my $fh, '>', \$variable or die "Can't open variable: $!";
print $fh "Treat this filehandle like any other\n";
Вы даже можете отобразить stdout или stderr в скаляр:
close STDOUT;
open STDOUT, '>', \$variable or die "Can't open STDOUT: $!";
Если вы хотите разделить вывод или настроить файл конфигурации, чтобы делать «интересные» вещи с вашим журналом, вам лучше использовать Log4Perl , как предлагали другие.
Вы имеете в виду что-то вроде IO :: Scalar ? Позволяет писать в переменную с семантикой дескриптора файла.
Если вы хотите вести выборочное ведение журнала, где вы можете контролировать, какие сообщения регистрируются и где они находятся зарегистрирован, используйте Log :: Log4perl . Это сэкономит вам кучу времени из-за того, что вы возитесь с галстуками
и прочей черной магией.
Вы можете использовать File :: Tee для разделения дескриптора файла на несколько выходных потоков.
use File::Tee;
open my $fh, '>', 'logfile.txt' or die $!;
tee( $fh, '>', 'otherlogfile.txt' ) if $condition;
print $fh $current_iteration; # will also go to otherlogfile.txt
# if $condition was true
Perlfaq5 рекомендует Tie :: FileHandle :: Multiplex для печати в несколько файлов.
Источник очень прост, и его должно быть легко изменить с помощью фильтра для каждого дескриптора.
Похоже, вы хотите привязать
дескриптор файла.
my $x;
# printing to $fh will update the variable $x
# when you close $fh, it will print $x to a filehandle depending
# on code in the function Print_to_variable::CLOSE
tie $fh, "Print_to_variable", \$x, $output_fh1, $output_fh2;
print $fh "stuff";
print $fh "more stuff";
close $fh;
sub Print_to_variable::TIEHANDLE {
my ($class, $ref, $fh1, $fh2) = @_;
my $self = {};
$self->{ref} = $ref;
$self->{output_fh1} = $fh1;
$self->{output_fh2} = $fh2;
bless $self, "Print_to_variable";
$self;
}
sub Print_to_variable::PRINT {
my ($self,@list);
${$self->{ref}} .= join "", @list;
}
sub Print_to_variable::CLOSE {
my $self = shift;
my $text = ${$self->{ref}};
if ( &myCondition1($text) ) { # ... how you decide where to print
print {$self->{output_fh1}} $text;
} else {
print {$self->{output_fh1}} $text;
}
}
Это потрясающий хак, и я думаю, что решение mobrule или (особенно) решение Синан для Log4Perl - это то, что мне нужно, когда у меня есть время.
Но, это то, что я использую в качестве дополнения:
sub print_to_var($$) {
my($rx_var, $scalar) = @_;
$$rx_var .= $scalar;
}
print_to_var \$logvar, $message;
#...later on...
print $somefile $logvar;
Edit:
Так как это вики сообщества, то, что Perl псевдонимы аргументов для функций, ничего не стоит. Это означает, что вы можете просто написать следующее:
sub print_to_var($$) {
$_[0] .= $_[1];
}
А затем сказать:
my $foo = "OH HAI. ";
print_to_var $foo, "I ARE HELO KITTIE.";
say $foo; # OH HAI. I ARE HELO KITTIE.
Это не особенно серьезный взлом, хотя print_to_var
намного больше печатает, чем .
есть.
А вот и HELO KITTIE: