1

を介して個々の文字のリストを受け取ることが期待される関数がありconst char *ます。各文字を にコピーするvector<char>必要がある場合、操作を実行するための最良の (つまり、最も効率的な) 方法は何でしょうか?

copy私はアルゴリズムで考えましたが、それがより「エレガントな」ソリューションであるかどうかはわかりません:

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

(私の「個人的な」インデント スタイルを考えると、コードがまだ読めることを願っています)

しかし、STLには、文字列にヌル文字が見つかるまでコピーできる何かが実装されているはずです。

(なぜ私が を受け取っているのか疑問に思うならconst char *、それはユーザーが一時変数を利用するときにコンパイラが作成する型であり、私の関数は のように呼び出されることが期待されていますexample("fvh")。代替ソリューションは歓迎されます)

前もって感謝します。よろしく、カルリッシュ

編集:

@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 に答える