我有一个函数,希望通过const char *
接收单个字符列表。如果我必须将每个字符复制到vector<char>
,那么执行该操作的最佳方法(即:最有效)是什么?
我在算法中考虑了copy
,不确定它是否是更“优雅”的解决方案:
void
example
(const char * const s)
{
copy(s, s+strlen(s), myvector.begin())
}
(希望,鉴于我的“个人”缩进风格,代码仍然可以读取)
但我确信STL实现的东西允许我复制直到在字符串中找到空字符。
(如果你想知道为什么我收到const char *
,那就是当用户使用时间变量时编译器创建的类型,我的函数应该像{{1}一样被调用欢迎替代解决方案)
提前致谢。最好的祝福, Kalrish
在尝试了@ipc和@juanchopanza所说的之后,我觉得很愚蠢:它就像一个魅力。
还不确定我是否会失去性能,但是,无论如何,编译器进行隐式转换,而且它是纯C ++,所以它绝对是可行的方法。
非常感谢,抱歉。祝好运, Kalrish
答案 0 :(得分:2)
直到我才知道副本。
这是'\0'
之前的副本:
#include <cstddef>
#include <algorithm>
#include <iostream>
#include <iterator>
struct str_copy_iterator {
bool at_end;
char const* ptr;
char operator*() const { return *ptr; }
typedef char value_type;
typedef std::ptrdiff_t difference_type;
typedef char* pointer;
typedef char& reference;
typedef std::output_iterator_tag iterator_category;
str_copy_iterator():at_end(true) {}
str_copy_iterator(char const* p):at_end(!p||!*p), ptr(p) {}
str_copy_iterator& operator++() {
++ptr;
at_end = !*ptr;
return *this;
}
str_copy_iterator operator++(int) {
str_copy_iterator tmp = *this;
++(*this);
return tmp;
}
bool operator!=( str_copy_iterator const& o ) const {
return !(*this == o);
}
bool operator==( str_copy_iterator const& o ) const {
if (at_end)
return o.at_end;
if (o.at_end)
return false;
return ptr == o.ptr;
}
};
int main() {
const char* bob = "hello world!";
char buff[100] = {};
std::copy(str_copy_iterator(bob), str_copy_iterator(), &buff[0] );
std::cout << buff << "\n";
}
将str_copy_iterator
扩展为通用iterator_until
包装器留给读者练习。
答案 1 :(得分:0)
您可以使用std::string
和std::vector::assign
方法。
void example(const std::string& s)
{
myvector.assign(s.begin(), s.end()):
}