我想在使用std::array
的函数中使用std::array
?
那么,什么是最简单/最短(两者都是)的方法来实现这一点。
例如。
#include <array>
#include <iostream>
void printInts(std::array<int, 4> someInts) {
for(int someInt : someInts) {
std::cout << someInt << std::endl;
}
}
std::array<double, 4> someDoubles{1.1, 2.2, 3.3, 4.4};
int main() {
printInts(someDoubles); // of course it doesn't work
return 0;
}
非常感谢你的每一次帮助;)
P.S
1
2
3
4
当然会是预期的产出。
如果您不能更改函数printts
,那么您可以创建数组的int
版本,并用它调用函数:
std::array<int, 4> ints;
std::copy(std::begin(someDoubles), std::end(someDoubles), std::begin(ints));
printInts(ints);
请注意,从double
到int
的转换可能会由于窄化转换而丢失精度。 如果转换后的double
值不能用int
表示,这甚至可能导致UB。
这是一个演示。
cigien建议使用std::array
中的值来填充std::array
。 但是,如果您想要一个返回std::array
专用命名函数,那么它应该类似于
#include <array>
#include <iostream>
void printInts(const std::array<int, 4> &someInts) {
for (int someInt : someInts) {
std::cout << someInt << std::endl;
}
}
template <size_t N>
std::array<int, N> castToInts(const std::array<double, N> &someDoubles) {
std::array<int, N> result;
for (int i = 0; i < N; i++) {
result[i] = static_cast<int>(someDoubles[i]);
}
return result;
}
std::array<double, 4> someDoubles{ 1.1, 2.2, 3.3, 4.4 };
int main() {
printInts(castToInts(someDoubles)); // now we can call like this
return 0;
}
如果您想要更简单,可以删除template
和硬编码4而不是n。
顺便说一下,我对您的prints
做了一点修改,请查阅关于通过引用传递对象参数的内容。
最简单,因为只需几个小的更改就可以使printts
按您的要求执行:
void printAsInts(std::array<double, 4> someDoubles) {
for (double someDouble : someDoubles) {
std::cout << static_cast<int>(someDouble) << '\n';
}
}
最短(而且可以说很容易),因为它依赖于标准库提供的设施,所以您甚至不需要编写循环:
#include <algorithm>
#include <array>
#include <iterator>
#include <iostream>
std::array<double, 4> someDoubles{1.1, 2.2, 3.3, 4.4};
int main() {
std::transform(someDoubles.begin(), someDoubles.end(),
std::ostream_iterator<int>(std::cout, "\n"),
[](double x) { return static_cast<int>(x); });
return 0;
}
上面的方法比其他一些方法的效率稍高,因为它不需要创建第二个数组。 对于只有四个元素的情况,第二个数组的开销并不大,但是如果数组的大小很大,那么您可能不想实例化一个临时数组。 它的效率也更高,因为std::endl
要求更频繁地刷新输出缓冲区。
更一般。 诚然,这并不是最容易或最短的编写方法,但一旦编写完成,它是最容易使用的,而且它提供了很大的灵活性,因为您可以在不接触打印代码的情况下更改容器的类型。
#include <algorithm>
#include <array>
#include <iterator>
#include <iostream>
#include <utility>
template<typename T, typename Iter>
void printAs(Iter begin, Iter end) {
std::transform(begin, end, std::ostream_iterator<T>(std::cout, "\n"),
[](const auto &x) { return static_cast<T>(x); });
}
template<typename T, typename Container>
void printAs(const Container &container) {
printAs<T>(std::begin(container), std::end(container));
}
std::array<double, 4> someDoubles{1.1, 2.2, 3.3, 4.4};
int main() {
printAs<int>(someDoubles);
return 0;
}