gpt4 book ai didi

与插入迭代器和重载运算符相关的 C++ STL 问题

转载 作者:太空宇宙 更新时间:2023-11-03 10:36:26 29 4
gpt4 key购买 nike

#include <list>
#include <set>
#include <iterator>
#include <algorithm>

using namespace std;

class MyContainer {
public:
string value;

MyContainer& operator=(const string& s) {
this->value = s;
return *this;
}
};

int main()
{
list<string> strings;
strings.push_back("0");
strings.push_back("1");
strings.push_back("2");

set<MyContainer> containers;
copy(strings.begin(), strings.end(), inserter(containers, containers.end()));
}

前面的代码无法编译。在标准 C++ 中,错误输出是冗长且难以理解的。关键部分好像是这个……

/usr/include/c++/4.4/bits/stl_algobase.h:313: error: no match for ‘operator=’ in ‘__result.std::insert_iterator::operator* [with _Container = std::set, std::allocator >]() = __first.std::_List_iterator::operator* [with _Tp = std::basic_string, std::allocator >]()’

...我认为这意味着所需的赋值运算符未定义。我查看了 insert_iterator 的源代码,发现它重载了赋值运算符。复制算法必须使用插入迭代器重载赋值运算符来完成它的工作(?)。

我猜是因为我的输入迭代器在一个字符串容器上,而我的输出迭代器在一个 MyContainers 容器上,所以重载的 insert_iterator 赋值运算符无法再工作。

这是我最好的猜测,但我可能错了。

那么,为什么这行不通,我怎样才能完成我想做的事情呢?

最佳答案

什么是使用构造函数(这比赋值更有意义):

class MyContainer {
public:
string value;

MyContainer(const string& s): value(s) {
}
};

那么第二个问题就是set也要求它的内容是可比较的。

至于原因,insert_iterator是通过重载operator=来工作的:

insert_iterator<Container>& operator= (typename Container::const_reference value);

如您所见,右边的值必须是容器的值类型或可隐式转换为容器的值类型,这正是(非显式)构造函数实现而赋值运算符不能实现的。


从技术上讲,您也可以通过提供合适的转换函数使其在不更改类的情况下工作(例如,如果您不想要非显式构造函数):

MyContainer from_string(const std::string& s)
{
MyContainer m;
m = s; //or any other method how to turn a string into MyContainer
return m;
}

可与 std::transform 一起使用:

transform(strings.begin(), strings.end(), inserter(containers, containers.end()), from_string);

关于与插入迭代器和重载运算符相关的 C++ STL 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2685506/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com