1

我有一个函数,预计将通过const char *. 如果我必须将每个字符复制到 a vector<char>,执行操作的最佳(即:最有效)方法是什么?

copyalgorithm中考虑过,不确定它是否是更“优雅”的解决方案:

void
example
    (const char * const s)
{
    copy(s, s+strlen(s), myvector.begin())
}

(希望,鉴于我的“个人”缩进风格,代码对你来说仍然是可读的)

但我确信 STL 实现了一些允许我复制的东西,直到在字符串中找到一个空字符。

(如果您想知道为什么我会收到一个const char *,那么,这是编译器在用户使用时态变量时创建的类型,并且我的函数预计会被称为example("fvh")。欢迎使用替代解决方案)

提前致谢。最好的问候, Kalrish

编辑:

在尝试了@ipc 和@juanchopanza 所说的之后,我觉得很愚蠢:它就像一个魅力。

仍然不确定我是否会失去性能,但无论如何,编译器都会进行隐式转换,而且它是纯 C++,所以这绝对是要走的路。

非常感谢,也很抱歉。祝你好运,卡尔里什

4

2 回答 2

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包装器留给读者作为练习。

于 2013-04-07T15:29:58.943 回答
0

您可以使用std::string, 和std::vector::assign方法。

void example(const std::string& s)
{
    myvector.assign(s.begin(), s.end()):
}
于 2013-04-07T15:24:00.690 回答