Для маленькой «x» простой петли ваш друг. Для больших «х» и относительно короткой «str» мы можем думать о «более умном» решении, повторно используя уже конкатенированную строку.
std::string MakeDuplicate( const std::string& str, unsigned int x ) {
std::string newstr;
if (x>0) {
unsigned int y = 2;
newstr.reserve(str.length()*x);
newstr.append(str);
while (y<x) {
newstr.append(newstr);
y*=2;
}
newstr.append(newstr.c_str(), (x-y/2)*str.length());
}
return newstr;
}
Или что-то в этом роде: o) (я думаю, что это может быть написано красивее, но идея есть).
EDIT: я был заинтересован в себе и сделал некоторые тесты, сравнивающие три решения на моем ноутбуке с визуальной студией (вариант повторного использования, простой цикл с предварительным распределением, простая копия и цикл-1 без предварительного использования). Ожидаемые результаты: для небольшой версии преалокации x (& lt; 10), как правило, самая быстрая, преалокация не была минимальной бит медленнее, поскольку большая скорость ускорения версии «повторного использования» действительно значительна (сложность log n vs n). Ничего, я просто не могу думать о какой-либо реальной проблеме, которая могла бы ее использовать: o)
Альтернативный подход к @ user2974951 заключается в сохранении всех файлов в списке с именем dataFiles.
name<-c("A", "B", "C", "D", "E", "F","G","H","I","J")
file<-c("A.txt", "B.txt", "C.txt", "D.txt", "E.txt",
"F.txt","G.txt","H.txt","I.txt","J.txt")
dataFiles = list()
for(i in 1:length(file)) {
dataFiles[[LETTERS[i]]] = read.table(file[i],sep="\t",header=TRUE)
}
> names(dataFiles)
[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J"
Я здесь использую БУКВЫ для присвоения имен, но вполне может быть:
name[i]