0

だから私は関数を持っています、ここではと呼ばれるKaylesPositionクラスがあります:vector<int>piles

// Produces a key to compare itself to equivalent positions     
std::string KaylesPosition::makeKey(){
  std::vector<int> temp(piles.size());
  for (int i = 0;i<piles.size();i++){
    temp[i]=piles[i];
  }

  std::sort (temp.begin(),temp.end());
  std::string key = "" + temp.at(0);
  for (int i=1 ; i<temp.size() ; i++){
    key.push_back('.');
    key.push_back(temp.at(i));
  }

  return key;
}

私の期待する出力はpiles、ピリオドで区切られた、順番にすべての要素である必要があります。ただし、代わりにkey「_M_range_check」として返されます。std :: string.append()を使用してこれを試しましたが、空の文字列またはピリオドが表示されます。この関数ですべての値の文字列を期待どおりに返すにはどうすればよいpilesですか?

4

1 に答える 1

1

問題はここにあるようです:

key.push_back(temp.at(i));

最初に整数の文字列表現を取得せずに、文字列に整数を追加しようとしています。その行を次のように置き換えてみてください。

key += std::to_string(temp.at(i)); // This will only work if your compiler supports C++11

コンパイラがC++11をサポートしていない場合は、これを試してください(忘れないでください#include <sstream>)。

std::ostringstream o;
o << temp.at(i);
key += o.str();

または、Boost(http://boost.org/)を使用するオプションがある場合は、そのlexical_castを試してください。

key += boost::lexical_cast<std::string>(temp.at(i));

このコードが最初にコンパイルされた理由は、パラメーターとしてpush_backaを受け入れ、 charに変換されるcharを渡すためですint(ただし、この場合はコンパイラーからの警告が予想されます)。

PS:同じことが回線にも当てはまります

  std::string key = "" + temp.at(0);
于 2012-10-29T03:11:14.467 に答える