如果我想将文件的内容复制到矢量,我可以这样做:
std::ifstream file("path_to_file");
std::vector<char> buffer(std::istream_iterator<char>(file),
std::istream_iterator<char>());
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果我只想复制第一个n
字符,我该怎么做?
编辑我可以编写自己的版本copy
,但有没有办法只使用现有的组件?
正如亚历山大指出的那样,最快的方式就是
std::vector<char> buffer(n);
file.read(&buffer[0], n);
Run Code Online (Sandbox Code Playgroud)
在C++ 0x中,您可以使用buffer.data()
而不是&buffer[0]
; 如果后者具有未定义的行为n == 0
.
正如史蒂夫所指出的那样,这需要copy_n()
,由于疏忽,不在当前的标准库中,而是在C++ 1x中.你可以轻松地自己实现一个,这是我认为正确的一个:
template<class InIt, class OutIt>
OutIt copy_n(InIt src, OutIt dest, size_t n)
{
if (!n) return dest;
*dest = *src;
while (--n)
*++dest = *++src;
return ++dest;
}
Run Code Online (Sandbox Code Playgroud)
请注意,std::copy_n()
假设输入迭代器能够传递n
对象.从文件中读取时,这可能会有问题.
没有std::copy_n()
,你可以使用std::generate_n
.
template< typename InIt >
struct input_generator {
typedef std::iterator_traits<InIt>::value_type value_type;
input_generator(InIt begin, InIt end) begin_(begin), end_(end) {}
value_type operator()()
{
assert(it_ != end);
return *it_++;
}
Init begin_;
Init end_;
};
std::vector<char> buffer;
buffer.reserve(42);
std::generate_n( std::back_inserter(buffer)
, 42
, input_generator(std::istream_iterator<char>(file))
, input_generator(std::istream_iterator<char>()) );
Run Code Online (Sandbox Code Playgroud)
但是,我并不认为这比直接从文件中读取更有优势,正如avakar所示.
归档时间: |
|
查看次数: |
1026 次 |
最近记录: |