我正在编写一个程序,它接受命令行参数,并使用自定义比较器以字母数字排序顺序打印出来。
在此过程中,我不得不在std::set容器中插入命令行参数。在线查看了一些类似的代码,发现如下内容:
std::set<char*, decltype(customComparator)> args (argv, argv+argc, customComparator)argv + argc 参数是什么意思?
在尝试插入cmd参数时,如下所示:
std::set<char*, decltype(customComparator)> args (argv, customComparator)在argv参数上有一条红色的曲线。
发布于 2022-05-21 15:57:50
"argv + argc“的意思是什么?
argv + argc是一个指针,指向最后一个命令行参数的末尾(或者指向下图所示的null )。下文对此作了解释(包括图形形式和文本形式)。
图显示为argc = 5:

解释
让我们考虑一下宣言:
int main (int argc, char *argv[])在上述声明中,名为argv的第二个参数的类型实际上是一个char**。也就是说,argv是指向指向char的指针的指针。这是因为char* [] 由于类型的衰变而使衰变为。
换句话说,argv是一个指针,指向数组的第一个元素,其元素类型为char*。此外,数组的每个元素argv[i] (具有char*类型的元素)本身指向一个字符,该字符是以空结尾的字符串的开始。也就是说,每个元素argv[i]指向数组的第一个元素,其元素类型为char。
发布于 2022-05-21 15:45:58
您展示的代码使用基于迭代器的构造函数,该构造函数接收begin迭代器和过去的end迭代器。
问题是,STL也认为指针是迭代器。++ptr运算符以及ptr != end_ptr和*ptr都能工作。
因此,如果您想要从一个C风格的对象集合构建一个STL容器,那么很有可能这样做。argv是所有args值的开始,argv[argc - 1]是结束。要在结束时得到一个指针,只需执行argv + argc。
发布于 2022-05-21 15:48:22
std::set构造函数的重载接受两个迭代器和一个比较器。这两个迭代器应该定义一个半开放范围。第二个迭代器指向范围的末尾,对于许多类型的范围,它是最后一个元素。argv指向数组的第一个元素,而argc是整数,则argv + argc指向同一个数组的argc第四个元素(从零开始)。H 112,因为argc数组中有意义的元素,D15指向数组的最后一个有意义的元素。(碰巧还有另一个元素,它是一个空指针,我们对它不感兴趣)。
总之,range [argv, argv + argc)正是许多地方所期望的半开放范围标准库。
https://stackoverflow.com/questions/72330953
复制相似问题