【问题标题】:C++ const char with .begin() and .end()带有 .begin() 和 .end() 的 C++ const char
【发布时间】:2020-09-19 23:15:30
【问题描述】:

所以我有一个看起来像这样的程序:

const char *Argv[] = {"stuff", "stuff1", "stuff3"};

bool pass = xxxxx::yyyyy(Argv.begin(), Argv.end(), Tri);

我认为这是非法的,因为const char * 不是用户定义的类型。但是,我不确定如何解决这个问题。我需要更改第一行还是第二行?还是两者兼有?

【问题讨论】:

  • 顺便说一句,这实际上是非法的,因为 (const char*)[3] 不是用户定义的(类)类型。让你绊倒的是排列整齐。元素类型无关紧要。
  • 只需使用指针:ArgvArgv + 3——迭代器只是 C++ 中指针的泛化。

标签: c++ arrays iterator namespaces const-char


【解决方案1】:

Argv 是一个数组(const char*s),是的,您不能像代码所示那样调用begin()end(),数组没有这样的成员函数。相反,您可以使用std::beginstd::end

const char *Argv[] = {"stuff", "stuff1", "stuff3"};
bool pass = xxxxx::yyyyy(std::begin(Argv), std::end(Argv), Tri);

如果您改用std::vectorstd::array 等其他标准容器,则可以在它们上调用成员函数begin()end()。请注意,即使对于这些容器,您仍然可以在它们上使用std::beginstd::end,这与调用它们的成员函数begin()end() 具有相同的效果。

【讨论】:

    【解决方案2】:

    为了完整起见,为了展示 c++ 方式,您可以将第一行更改为:

    std::array<std::string_view, 3> Argv {"stuff", "stuff1", "stuff3"};
    

    然后是第二行:

    bool pass = xxxxx::yyyyy(Argv.begin(), Argv.end(), Tri);
    

    会正常工作的。

    【讨论】:

    • 这里似乎不需要两层间接和动态分配。 const char* 的数组就可以了(尽管我很想把它们放在 std::array 中)。
    • @AsteroidsWithWings 我明白你的意思,但是使用vector 真的会影响这段代码的性能吗?我的意思是,它可能是,但我总是推荐vector,除非有其他原因。
    • 不,但您称其为“C++ 方式”,当原始版本是完全有效的 C++ 并且在许多情况下完全合理时,这似乎不太公平。依靠相对昂贵的解决方案绝对没有收益并不是好的编程。这一切都加起来了。示例:您现在下载到手机的琐碎应用程序是 200MB、300MB,而 它们根本不需要。如果程序员不那么浪费,我们将能够利用我们的现代技术享受惊人的存储量。相反,我们用惰性代码浪费了硬件的进步。
    • c++ 方法是使用向量。有很多糟糕的 C++ 代码是有效的。我不是建议在vector退回,而是从那里开始
    • 我建议从适合这项工作的工具开始,无论您使用哪种语言编写。数组也是“C++ 方式”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 2020-07-12
    • 1970-01-01
    相关资源
    最近更新 更多