C++ 设置迭代器错误 : no match for ‘operator+=’

标签 c++

我正在尝试遍历一组对象并创建一个以逗号分隔的名称字符串。代码的注释掉的部分应该只在它不是集合中的最后一个时添加一个逗号,但它会产生以下错误:

错误:“operator+=”不匹配(操作数类型为“std::_Rb_tree_const_iterator”和“long int”) _M_current += -__n;

如果我使用 vector 而不是集合,效果很好。我做错了什么?

std::string paramList = "";
std::set<Param>::iterator end = params.end();
for (std::set<Param>::iterator it = params.begin(); it != end; ++it) {
  paramList += (*it).name;
  /*if (it != end -1) {
    paramList += ",";
  }*/
}

最佳答案

只有某些类别的迭代器允许您直接执行任意算术运算,例如 end-1 .

集合的迭代器允许一次前进和后退一步,使用it++it-- .确实it - 1仍然只遍历一步,但规则更通用(语言不知道您提供的整数只是 1 并且没有理由与 42 相比做出特殊情况)。

可以使用 std::next/std::prev得到这种行为。这是故意更冗长的,以阻止您在迭代器上进行任意运算,这对于这种迭代器来说比对于简单的类似数组的事物(例如 vector )来说成本更高。

在这种情况下,std::prev(end)将为您工作,并且相本地道。

但是,如果你发现自己写了类似 std::next(it, 42) 的东西,您可能需要考虑改进您的算法,或使用不同的容器。

同样,此限制的目的正是鼓励这种想法。

另一种编写算法的方法可能是:

std::string paramList;
std::set<Param>::iterator begin = params.begin(), end = params.end();
for (std::set<Param>::iterator it = begin; it != end; ++it) {
  if (it != begin)
    paramList += ",";

  paramList += (*it).name;
}

请注意我是如何翻转逻辑以避免做任何算术运算的。

实际上我通常使用 bool为此标记(当我的 paramList 是一个字符串流时)或者总是附加一个 ,然后缩小paramList如果params,则稍后(当它是一个字符串时)是非空的。

关于C++ 设置迭代器错误 : no match for ‘operator+=’ ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53725453/

相关文章:

c++ - 使用 C++20 概念将函数参数约束为分配器

c++ - 命名空间和预处理器

c++ - 声明变量时extern undefined reference错误

c++ - UWP/WinRT : How to perform a UI task upon completion of an asynchronous operation in a model?

c++ - 什么时候应该在 C++ 中使用引用?

c++ - const_cast<const string &>(s), while s 是字符串类型怎么办?

c++ - 使用 sed 将文本文件转换为 C 字符串

c++ - 如何强制转换优先于其他转换?

c++ - 如何使 C++ builder xe2 中的其他线程可以访问控件?

C++ 动态矩阵乘法返回问题