【问题标题】:String vector iterator in c++C++中的字符串向量迭代器
【发布时间】:2021-04-01 21:20:43
【问题描述】:

我只是想通过字符串向量获取迭代器,将迭代器传递给“pos”并与 pos 处的值一起传输到另一个函数,但编译器告诉我在从 'const char*' 到 'size_t' 的 lambda 参数。我也为标题 stl_algo.h 得到了这个:

不匹配调用 '(prototype::Monitor::setOptions(size_t)::) (const char&)' __f(__first);

#include <iostream>
#include <Windows.h>
#include <string.h>
#include <map>
#include <vector>
#include <algorithm>
#include <iterator>
#include <cstdio>
.
.
void setOptions(size_t id) {
    switch(id){
        case 0:
            std::for_each(main_menu.lines.begin(), main_menu.lines.end(),[this](size_t pos){
                this->setOption(pos, main_menu.lines[pos]);
            });
            break;
        case 1:
            break;
    }
}

所有这些都在'this'引用的类中,并且setOption与setOptions不同。我在其他地方读到,如果它只是将字符串指针的迭代器转换为 int 应该没问题,我也看到过这样使用的示例。

我也知道这整件事可能不是最好的方法,但我刚接触 c++,我正在尝试使用我学到的一些东西。

Win10 64bit - gcc (MinGW.org GCC-6.3.0-1)

【问题讨论】:

  • 您具体要问什么?看看std::for_each 的参考,它不是这样工作的。那里也有例子。基本上,lamda 将迭代范围的元素作为参数,而不是索引,而不是迭代器。

标签: c++ string c++11 vector lambda


【解决方案1】:

当使用 std::for_each() 迭代字符串向量时,传递给 lambda 的参数将是字符串,而不是 size_t 索引。这就是您收到转换错误的原因。

如果您需要索引,则必须更改 lambda 以单独跟踪索引,例如:

size_t pos = 0;
std::for_each(main_menu.lines.begin(), main_menu.lines.end(),
    [&,this](const string &s){ this->setOption(pos++, s); }
);

否则,干脆不要用std::for_each()开头,例如:

for(size_t pos = 0; pos < main_menu.lines.size(); ++pos){
    setOption(pos, main_menu.lines[pos]);
}

【讨论】:

  • 您还可以将pos 包含在 lambda 中:[this, pos = 0](const string&amp;) mutable { ... }
  • @DietmarKühl 是的,尽管在这种情况下pos 的类型将是int,而不是size_t。您必须改用[this, pos = size_t{0}]
  • 因此,如果这对您的用例很重要,您可以使用 pos = std::size_t()pos = std::string::size_type()。更有趣的一点是用范围写这个应该像std::ranges::for_each(zip(main_menu.list, std::ranges::iota(std::size_t()), [this](const std::string&amp; s, std::size_t pos){ ... }); 警告:没有zip() [还]。
猜你喜欢
  • 1970-01-01
  • 2017-07-25
  • 1970-01-01
  • 2015-01-13
  • 1970-01-01
  • 2011-07-22
  • 2019-02-11
  • 1970-01-01
  • 2017-10-03
相关资源
最近更新 更多