簡體   English   中英

如何從 std::vector 轉換<float>到 std::istream?</float>

[英]How to convert from std::vector<float> to std::istream?

我有一個 std::vector 並且 function 需要一個 std::istream:

callMe(std::istream& is)

進行轉換的最佳方法是什么? 還有比這更聰明的嗎?

std::stringstream sstr;
for(int i = 0; i < myVector.size(); ++i) {
    sstr << myVector[i] << " ";
}
std::istringstream istr{sstr.str()};
callMe(istr);

編輯:感謝到目前為止的建議! 更新代碼:

std::stringstream sstr;
for(const float& val : myVector) {
    sstr << val << " ";
}
callMe(sstr);

問題是std::istream本質上是基於字符的。 如果您想繼續使用callMe(std::istream& is)作為接口,您必須將myVector的每個元素轉換為字符並在某個時候返回。 如果您想堅持使用此選項,我個人認為ostream_iterator是一個優雅的解決方案:

copy(begin(data), end(data), std::ostream_iterator<float>(sstr));

完整示例:

void callMeStream(std::istream &is)
{
  float f1;
  is >> f1;
  std::cout << "Stream: " << f1 << std::endl;
}

// ...

std::vector<float> data = {3.5, 1.5, 2.5 /* ... */};

std::stringstream sstr;
copy(begin(data), end(data), std::ostream_iterator<float>(sstr));
callMeStream(sstr); // Output: "Stream: 3.51"

如果您願意更改callMe的簽名,則可以避免這種轉換:

template <class T>
void callMeTemplate(T &is)
{
  float f1;
  is >> f1;
  std::cout << "Template: " << f1 << std::endl;
}

#define NO_ELEMENT -1.0;

class data_wrapper
{
  std::vector<float>::const_iterator current;
  const std::vector<float>::const_iterator last;

public:
  data_wrapper(const std::vector<float> &data) : current(begin(data)), last(end(data)) {}

  data_wrapper &operator>>(float &value)
  {
    if (last == current)
    {
      value = NO_ELEMENT;
    }
    else
    {
      value = *current++;
    }
    return *this;
  }
};

// ...
data_wrapper wrapper(data);
callMeTemplate(wrapper); // Output: "Template: 3.5"

在第二個示例中, float值永遠不會轉換為字符序列,並且可以接受data_wrapperstd::istream類型。 當然,如果您願意完全更改callMe的簽名,您不妨將其更改為直接接受開始/結束迭代器范圍或vector

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM