我想写自己的代码来迭代一个n维向量(维度是已知的),代码如下:
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){
^~~
有人能帮我纠正它或给我一个更好的方法来打印矢量吗?提前感谢您的时间。
2条答案
按热度按时间xmd2e60i1#
如果维度在编译时是已知的,那么使用
template
将维度作为非类型参数就可以很容易地解决这个问题。对于2d向量,其用途是:
Live Example
但是,如果您总是知道
const auto& i
将是std::vector
类型,则可以通过根本不使用auto
参数,而是使用template
匹配来更容易地解决这个问题:Live Example
为了计算向量的“维数”,你可以写一个递归类型特征:
Live Example
有了上面的递归特性,就可以得到每个
template
d向量类型的“维数”,而根本不需要用户传入值。如果您仍然希望每次都打印
k:
,您可以简单地使用上面的命令:这仅在已知类型为
vector
时有效--但是也可以使用概念来编写它,以处理遵循vector
之类的抽象定义的任何内容。如果你想让它适用于 any range类型,那么你可以用
requires(std::ranges::range<T>)
替换vector
-重载,并将用于查找维度的模板专用化修改为也使用相同的类型。我不会用所有这些代码来破坏答案,因为它与上面的代码基本相同--但我将在下面的操作中链接到它:Live Example
flseospp2#
我做了一个函数,可以打印任何n维可迭代容器:
这个函数有一个默认的std::function,可以打印任何内置类型,如int,unsigned char,long long等,还有c字符串,如char或const char*,如果你有另一个对象,如pair或tuple或你的类的对象,你可以传递一个函数来打印你的对象。
您可以像这样使用函数:(你必须明确地告诉函数你最里面的对象,如下所示)
功能可以找到here,也许我会更新在未来支持更多的东西。
编辑:你需要至少有c++20这个函数的工作