Меня удивляет, что это еще не упоминалось, поэтому для полноты ...
Вы можете выполнить распаковку списка с помощью оператора «splat»: *
, который также будет скопируйте элементы вашего списка.
old_list = [1, 2, 3]
new_list = [*old_list]
new_list.append(4)
old_list == [1, 2, 3]
new_list == [1, 2, 3, 4]
Очевидным недостатком этого метода является то, что он доступен только в Python 3.5 +.
Сроки, однако, это работает лучше, чем другие распространенные методы.
x = [random.random() for _ in range(1000)]
%timeit a = list(x)
%timeit a = x.copy()
%timeit a = x[:]
%timeit a = [*x]
#: 2.47 µs ± 38.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
#: 2.47 µs ± 54.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
#: 2.39 µs ± 58.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
#: 2.22 µs ± 43.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
Вы не можете, так как std::ifstream
удалил конструктор копии и назначение копии. Вы можете обойтись, выполняя
filestream.swap(ifstream(filename)).
. Тот факт, что он компилируется на визуальной студии, в основном потому, что он встраивается в любое перемещение или перемещение конструктора (я не очень хорошо говорю вам, что именно) , Если вы попробуете
std::ifstream myF;
filestream = myF;
, он не будет компилироваться.
Однако вы можете попытаться сделать перемещение, которое я написал, или вы можете просто вызвать .open
( http : //en.cppreference.com/w/cpp/io/basic_ifstream/open )
std :: ifstream не имеют конструктора копирования, вероятно, одного из многих расширений VC ++. Правильный код:
Parser::Parser(const char* filename) :
filename(filename),
linect(0),
filestream(filename)
{
}
Обратите внимание на переменную-член и имя параметра. Используйте это-> или измените имя (рекомендуется, обычно префикс используется для переменных-членов _
или m_
)
filestream
, так как переменные-члены строятся в порядке их объявления (afaik)?
– Creris
15 July 2014 в 22:06
Я думаю, лучшее решение для вас было бы для вас:
ifstream
. Parser
с помощью объекта ifstream
. Parser
, чтобы сохранить ссылку на объект istream
. Это позволяет вам гибко анализировать содержимое файла, stdin и строку. class Parser
{
private:
std::istream& str;
std::vector<std::string> tokens;
unsigned int linect;
public:
Parser(std::istream& s) : str(s) ... {}
...
};
filestream.open(filename)
в тело конструктораParser
. Я забыл, что вы можете открыть файл за пределами конструктора потока ... doh! – Evan W 15 July 2014 в 22:13