gpt4 book ai didi

c++ - 迭代 n 维 vector c++

转载 作者:行者123 更新时间:2023-12-04 07:23:46 26 4
gpt4 key购买 nike

我想编写自己的代码来迭代一个 n 维 vector (其中维度是已知的)。这是代码:

void printing(const auto& i, const int dimension){
int k= dimension;
for(const auto& j: i){
if(k>1){
cout<<"k: "<<k<<endl;
printing(j, --k);
}
else{
//start printing
cout<<setw(3);
cout<<j; //not quite sure about this line
}
cout<<'\n';
}
}
我收到一个错误:
main.cpp:21:5: error: ‘begin’ was not declared in this scope
for(const auto& j: i){
^~~
有人可以帮我纠正它或给我一个更好的方法来打印 vector 吗?
在此先感谢您的时间。

最佳答案

如果在编译时已知尺寸,则可以使用 template 轻松解决此问题。将维度作为非类型参数。

template <std::size_t Dimensions>
void printing(const auto& i){
if constexpr (Dimensions != 0) {
for(const auto& j: i){
// I'm not sure if it is intentional to print 'k' each iteration,
// but this is kept for consistency with the question
cout<<"k: " << Dimensions << endl;
printing<Dimensions - 1u>(j);
}
} else {
cout << setw(3);
cout << j;
cout << '\n';
}
}
对于二维 vector ,用途是:
printing<2>(vec);
Live Example

但是,如果您始终知道 const auto& i将是 std::vector类型,您可以通过不使用 auto 来更轻松地解决此问题。参数,而是使用 template匹配:
// called only for the vector values
template <typename T>
void printing(const std::vector<T>& i){
for(const auto& j: i){
// possibly compute 'k' to print -- see below
printing(j);
}
}

// Only called for non-vector values
template <typename T>
void printing(const T& v) {
cout << setw(3);
cout << v;
cout << '\n';
}
Live Example
要计算 vector 的“维度”,您可以为此编写递归类型特征:
#include <type_traits> // std::integral_constant

// Base case: return the count
template <std::size_t Count, typename T>
struct vector_dimension_impl
: std::integral_constant<std::size_t, Count> {};

// Recursive case: add 1 to the count, and check inner type
template <std::size_t Count, typename T, typename Allocator>
struct vector_dimension_impl<Count, std::vector<T,Allocator>>
: vector_dimension_impl<Count + 1u, T> {};

// Dispatcher
template <typename T>
struct vector_dimension : vector_dimension_impl<0u, T> {};

// Convenience access
template <typename T>
inline constexpr auto vector_dimension_v = vector_dimension<T>::value;

// Simple tests:
static_assert(vector_dimension_v<std::vector<int>> == 1u);
static_assert(vector_dimension_v<std::vector<std::vector<int>>> == 2u);
static_assert(vector_dimension_v<std::vector<std::vector<std::vector<int>>>> == 3u);
Live Example
通过上面的递归特征,你可以得到每个 template 的“维度”。 d vector 类型,完全不需要用户传入值。
如果您还想打印 k: 每次,您都可以简单地使用上述内容:
cout << "k: " << vector_dimension_v<T> << endl;
这仅在已知类型为 vector 时才有效。 -- 但它可以使用概念来编写任何遵循抽象定义的东西,比如 vector以及。
如果您希望它适用于任何类似范围的类型,那么您可以替换 vector -重载 requires(std::ranges::range<T>)相反,并将用于查找维度的模板特化更改为也使用相同的。我不会用所有这些代码污染答案,因为它与上面的基本相同——但我将在下面的操作中链接到它:
Live Example

关于c++ - 迭代 n 维 vector c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68338833/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com