c ++ copy-until算法

时间:2013-04-07 15:16:29

标签: c++ algorithm vector

我有一个函数,希望通过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

2 个答案:

答案 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::stringstd::vector::assign方法。

void example(const std::string& s)
{
    myvector.assign(s.begin(), s.end()):
}