草庐IT

c++ - 比较 std::vector 在命名空间中使用自己的类不编译

以下代码无法编译,因为未找到比较运算符。#include#include#includenamespaceCool{structPerson{std::stringname;};}booloperator==(constCool::Person&p1,constCool::Person&p2){returnp1.name==p2.name;}intmain(int,char*[]){std::vectora{{"test"}};std::vectorb{{"test"}};boolok=a==b;std::cout经过一些实验,我发现以下代码可以完美编译:#include#includ

c++ - 双索引的最佳容器

设置允许双重索引的容器的最佳方法(在C++中)是什么?具体来说,我有一个对象列表,每个对象都由一个键索引(每个键可能多个)。这意味着multimap。然而,这样做的问题在于,这意味着查找对象的位置可能比线性查找更糟糕。我宁愿避免数据重复,所以让每个对象保持它自己的坐标并且必须在map中移动自己是不好的(更不用说移动你自己的对象可能会在成员函数中间接调用你的析构函数!)。我宁愿一些容器通过对象指针和坐标来维护索引,并且对象本身保证稳定的引用/指针。然后每个对象可以存储一个迭代器到索引(包括坐标),充分抽象,并知道它在哪里。Boost.MultiIndex似乎是最好的主意,但它非常可怕,我

c++ - 如何在 C++ 中创建高效的二维网格?

我想创建一个非常易于使用的2D网格。网格中的每个单元格都需要能够存储大量数据。理想情况下,我希望能够一次遍历一个单元格,并获得任何网格单元格的直接邻居。我的第一个想法是存储指向Cell邻居的指针vector(总共4个),然后为leftNeighbour、rightNeighbour等创建便利函数。初始化后连接网格。std::vector应该是一个可动态调整大小的数组,所以如果我只想硬编码指针的位置(0==左,1==右,ETC)。但是,它确实提供了一种更好的方法来遍历单元格的邻居。我必须考虑的另一件事是单元格是否位于网格边缘的边界上(是对此进行测试还是只是隐式地将网格扩展一个单元格以便永

c++ - 如何调用对象的成员函数作为 std 算法的 unary_function?

我有一个看起来像这样的类。classA{public:voiddoSomething();}我有一组这些类。我想对数组中的每个项目调用doSomething()。使用算法header执行此操作的最简单方法是什么? 最佳答案 使用std::mem_fun_ref将成员函数包装为一元函数。#include#includestd::vectorthe_vector;...std::for_each(the_vector.begin(),the_vector.end(),std::mem_fun_ref(&A::doSomething));

C++ std::transform 副作用

我已经实现了这样的UnaryOperationstructConverter{Converter(std::size_tvalue):value_(value),i_(0){}std::stringoperator()(conststd::string&word){return(value_&(1我喜欢用它std::vectorv;//initializationofvstd::transform(v.begin(),v.end(),std::back_inserter(result),Converter(data));我的问题是我能否依赖我的假设,即算法将按照“Converter::

c++ - 如何根据动态属性对项目进行排序?

我正在使用STLstd::multiset作为指针的排序列表。排序顺序由所指向项目的属性决定,类似于这个简化示例:structA{intx;};boolCompareAPointers(constA*lhs,constA*rhs){returnlhs->xx;}std::multisetsorted_set;复杂的是,用于对集合进行排序的属性值可能会发生变化(您可以在上面的示例中更改A.x),这会使排序顺序不正确:Aa1,a2;a1.x=1;a2.x=2;sorted_set.insert(&a1);sorted_set.insert(&a2);a1.x=3;当相关属性发生变化时,我可

c++ - 哪个是迭代字符串排列的最佳数据结构?

比方说,我们有字符串“ABCAD”,现在我们需要在顺时针和逆时针方向上遍历该字符串的所有可能排列。我丑陋的实现看起来像这样:strings="ABCAD";stringt="";for(inti=0;i输出:阿绍HSAUA苏亚奥哈斯美国哈萨克斯坦大学美国航空安全协会阿修绍阿豪斯AUASH我知道这太天真了,AFAIK循环列表会是更好的选择,有人可以使用STL更有效地实现同样的事情吗? 最佳答案 在伪代码中,我会走这条路:functionrearrange(strings){stringt=s+s;for(inti=0;i可能有一种使用

c++ - 为什么 numeric_limits<int>::min() 有不同的定义?

要检索最小值,我必须使用numeric_limits::min()我想最小的整数是-2147483648,在我的机器上测试显示了这个结果。但是一些C++引用,如OpenGroupBaseSpecifications和cplusplus.com用值-2147483647定义它。我问这个问题是因为在我实现negaMax框架时(游戏树搜索)值最小整数*(-1)必须明确定义。是的,使用minimalint=(numeric_limits::min()+2)在任何情况下我都是安全的,因此我的问题更具理论性,但我认为还是很有趣。 最佳答案 如果

c++ - 使用构造函数向 std::set 插入一个元素

是否可以向std::set插入一个新元素,例如std::list的情况://插入一个名为“string”的元素到mylist的子列表std::list>mylist;mylist.push_back(std::list(1,"string"));现在,mylist在它的std::list类型的子列表中有一个std::string类型的元素。如果std::set是std::list的子集我的列表即std::list>mylist;如果你不能,那为什么不呢? 最佳答案 我认为这应该可以解决问题:intmain(){strings="te

c++ - operator<< 无法输出 std::endl -- 修复?

下面的代码在应该只输出std::endl时出错了:#include#includestructMyStream{std::ostream*out_;MyStream(std::ostream*out):out_(out){}std::ostream&operatorstructFoo{OutputStream*out_;Foo(OutputStream*out):out_(out){}voidtest(){(*out_)foo(&out);foo.test();returnEXIT_SUCCESS;}错误是:stream1.cpp:19:error:nomatchfor'operato