我有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的自动转换值)
答案 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;
}