在C ++中使用auto转换数据类型

时间:2016-10-11 12:33:54

标签: c++11

我有2个向量容器,其中包含2种不同类型的值,数据类型为 uint32_t 。我想把它们一起打印出来。 这就是我所拥有的

vector<uint32_t> data1;
vector<uint32_t> data2;

现在我知道一种单一数据的方法,如下所示

for(auto const& d1: data1)
   cout<< d1 << endl;

但我想像这样打印两个数据,

   cout<< d1 << "\t" << d2 << endl;

如何使用auto执行此操作? (其中d2是来自data2的自动转换值)

3 个答案:

答案 0 :(得分:3)

您可以在索引上使用普通for循环:

int

修改:例如,如果您想将auto d1 = static_cast<int>(data1[i]); 转换为val spark = SparkSession .builder .appName("MQTTStreamWordCount") .master("local[4]") .getOrCreate() import spark.implicits._ // Create DataFrame representing the stream of input lines from connection to mqtt server val lines = spark.readStream .format("org.apache.bahir.sql.streaming.mqtt.MQTTStreamSourceProvider") .option("clientId", "sparkTest") .option("username", "user") .option("password", "psw") .option("brokerUrl", "tcp://ip:1883") .option("topic", "/bikes") .option("cleanSession", "true") .load("tcp://ip:1883").as[(String, Timestamp)] val query = lines.select("value").writeStream .outputMode("append") .format("console") .start() query.awaitTermination() ,则可以执行以下操作:

{{1}}

但是您需要确保转换是安全的。即该值适合目标类型。

答案 1 :(得分:2)

使用Boost Zip Iterator,它可以让您拥有一系列对,而不是两个向量范围&#39;数据类型。有点像:

#include <boost/iterator/zip_iterator.hpp>
#include <boost/range.hpp>
#include <stdint.h>
#include <vector>
#include <iostream>

template <typename... TContainer>
auto zip(TContainer&... containers) -> boost::iterator_range<boost::zip_iterator<decltype(boost::make_tuple(std::begin(containers)...))>> {
    auto zip_begin = boost::make_zip_iterator(boost::make_tuple(std::begin(containers)...));
    auto zip_end = boost::make_zip_iterator(boost::make_tuple(std::end(containers)...));
    return boost::make_iterator_range(zip_begin, zip_end);
}

int main()
{
        std::vector<uint32_t> data1( { 11, 22, 33 } );
        std::vector<uint32_t> data2( { 44, 55, 66 } );
        for (auto t : zip(data1, data2)) {
                std::cout << boost::get<0>(t) << "\t" << boost::get<1>(t) << "\n";
        }
}

zip()功能归this question所有,您可以将其放在单独的头文件中,因为它不是您的具体情况。

答案 2 :(得分:1)

如果可能(并且对您的用例合理):使用成对的容器

如果你的申请不在w.r.t的绑定中。计算机资源,你知道你将成对使用两个容器的值(假设相同长度的容器,如你的例子),实际使用一对容器可能是有用的,这也可以减轻使用整齐的基于范围的for循环(&gt; = C ++ 11)。

#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
  std::vector<uint32_t> data1 = {1, 2, 3};
  std::vector<uint32_t> data2 = {4, 5, 6};

  // construct container of (int, int) pairs
  std::vector<std::pair<int, int>> data;
  data.reserve(data1.size());
  std::transform(data1.begin(), data1.end(), data2.begin(), std::back_inserter(data),
                 [](uint32_t first, uint32_t second) {
                   return std::make_pair(static_cast<int>(first), static_cast<int>(second));
                 });   /* as noted in accepted answer: you're responsible for
                          ensuring that the conversion here is safe */

  // easily use range-based for loops to traverse of the
  // pairs of your container
  for(const auto& pair: data) {
    std::cout << pair.first << " " << pair.second << "\n";
  } /* 1 4
       2 5
       3 6 */

  return 0;
}