C++11 如何执行基于范围的c++;11用于字符*argv[]上的循环?
我想在C++11 如何执行基于范围的c++;11用于字符*argv[]上的循环?,c++11,for-loop,range,C++11,For Loop,Range,我想在char*argv[]上试用基于c++11范围的for循环,但我遇到了错误。目前的做法是: for( char* c : argv ) { printf("param: %s \n", c);
char*argv[]
上试用基于c++11范围的for循环,但我遇到了错误。目前的做法是:
for( char* c : argv )
{
printf("param: %s \n", c);
}
在我的makefile中,我有以下行:
g++ -c -g -std=c++11 -O2 file.cc
argv
是指向原始字符串的指针数组,不能直接从中获取范围
使用C++17可以使用
std::string\u视图
来避免分配字符串:
for (auto && str : std::vector<std::string_view> { argv, argv + argc })
{
std::printf("%s\n", str.data()); // Be careful!
std::cout << str << std::endl; // Always fine
fmt::print("{}\n", str); // <3
}
您不能使用基于范围的循环,因为您没有范围 您可以编写自己的范围包装器(一种“数组视图”),也可以只使用普通循环:
for (char ** p = argv, e = argv + argc; p != e; ++p)
{
// use *p
}
使用包装器:
#include <cstddef>
template <typename T>
struct array_view
{
T * first, * last;
array_view(T * a, std::size_t n) : first(a), last(a + n) {}
T * begin() const { return first; }
T * end() const { return last; }
};
template <typename T>
array_view<T> view_array(T * a, std::size_t n)
{
return array_view<T>(a, n);
}
#包括
模板
结构数组视图
{
第一,最后;
数组视图(T*a,std::size\T n):第一个(a),最后一个(a+n){
T*begin()常量{return first;}
T*end()常量{return last;}
};
模板
数组\u视图\u数组(T*a,std::size\u T n)
{
返回数组_视图(a,n);
}
用法:
for (auto s : view_array(argv, argc))
{
std::cout << s << "\n";
}
for(自动s:view_数组(argv,argc))
{
std::这行得通吗,但是:创建向量难道不是一种开销吗?其次,为什么我不能使用printf(“参数:%s\n”,str);
(我得到:不能通过“…”传递可复制类型为“const class std::basic_string”的对象)
?要从std::string
获取const char*
,请使用成员函数:printf(“参数:%s\n”,str.c_str())在我的VIM中,它是在每一个C++文件上的文件,我在下面的行中得到如下:<代码>请求“STR”中的成员'cySTR ',它是非类类型的const int’/CODE。
上面的代码编译并运行良好,您可以调用g++-c-g-std=c++11-O2 test.cpp
,因此您在这里遇到了一些不相关的问题。我已将auto更改为std:string
,并消除了它们:)可能重复的
for (auto s : view_array(argv, argc))
{
std::cout << s << "\n";
}