在vs2013中,c++中set容器定义对象时,参数列表中显式调用greater无法被识别,啥原因?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在vs2013中,c++中set容器定义对象时,参数列表中显式调用greater无法被识别,啥原因?相关的知识,希望对你有一定的参考价值。

#include<iostream>
#include<algorithm>
#include<set>
#include<iterator>
using namespace std;
using std::greater;

template <class T>

void print_set(const T&s, const char *sr)

ostream_iterator<T::value_type>out(cout," ");
cout << sr;
copy(s.begin(),s.end(),out);
cout << endl;


int main()

typedef set<int>Se;
Se s1;
pair<Se::const_iterator, bool>p1;
for (int i = 3; i > 0; i--)

p1 = s1.insert(i);
if (p1.second)

cout << *(p1.first) << " true" << endl;



p1 = s1.insert(2);
if (p1.second)

cout << *(p1.first) << " true" << endl;

else
cout << "eorror" << endl;

print_set(s1, "s1:");

cout << "-----------------------" << endl;

typedef set<double, greater<int>>Sd;
Sd s2;
for (int i = 0; i < 3; i++)

s2.insert(i*0.3);
print_set(s2,"s2:");

if (s2.find(1.5) != s2.end())

cout << "存在1.5这个数" << endl;

if (s2.find(3.5) == s2.end())

cout << "不存在3.5这个数" << endl;

cout << "-----------------------" << endl;
getchar();

定义了构造函数,系统就不会用默认的构造函数了。 代码中你定义了自己的带参构造函数,所以系统的默认构造函数就在编译时,不会生成了。 这个就需要自己定义了。 否则的话,Date a;这样使用的时候就会报错。 参考技术A 包含头文件#include<functional>本回答被提问者采纳

iCloud 容器默认 vs 自定义

【中文标题】iCloud 容器默认 vs 自定义【英文标题】:iCloud container default vs custom 【发布时间】:2015-03-02 02:13:56 【问题描述】:

我正在将 iCloud Core Data 同步添加到已发布的应用程序中。我对默认容器和自定义容器之间的区别感到困惑。

我从测试中学到了什么:

当我使用默认容器时,我的应用程序将数据存储在 iCloud 中,但不会在不同设备之间同步。因此,假设我在 iPhone(设备 A)上安装了我的应用程序。当我使用默认容器时,我可以删除我的应用程序,重新安装它,进行 iCLoud 同步并恢复之前保存在 iCloud 中的数据。所以它就像 iCloud 中的备份一样工作。但不起作用的是,它将数据跨不同设备同步,例如从 iPhone(设备 A)到另一设备,例如 iPad(设备 B)。

当我改用自定义容器时,它会在不同设备之间同步。它就像我希望它工作一样工作。我的数据在不同的设备上同步,我在 iPhone(设备 A)和 iPad(设备 B)上拥有相同的数据。

这是我从测试中学到的。但与此同时,我的帐户似乎真的因为所有的测试以及从设备上删除和擦除 iCloud 数据而变得一团糟,因为你不能删除容器并进行全新的安装,所以它真的有点搞砸了。我对纪录片感到困惑。它说如果多个应用程序共享同一个容器,则使用自定义容器。但是多个应用程序是否意味着他在不同设备上的同一个应用程序?或者它们是指真正不同的应用程序?

我说的对吗?这就是默认容器和自定义容器的区别吗?

所以当我想在不同设备上同步同一个应用时,我必须使用自定义容器吗?

感谢您的帮助!

【问题讨论】:

【参考方案1】:

我有(仍然有)同样的问题。我真的只需要一个容器,我的应用程序使用它来在许多设备之间进行同步。在使用默认(iCloud 和 bundleID 命名容器)并与我的设置同步失败后。我恢复到测试以前的(应用程序之前使用了团队前缀容器)“自定义”容器,看起来我能够进行我需要的所有同步测试。

结果似乎因测试设置而异(仅限设备、组合、仅限模拟器)。 iCloud 测试应该始终是专门的设备,因为它们被设置为不同的行为(不像模拟器那样贪婪)。无论如何,你想要的只是真实世界的结果。

我的有限设置包括设备上的一个(免费)应用程序和一个使用 iCloud 与 iCloud Drive 迁移帐户 (iOS 8.4) 的模拟器。在我的情况下,同步是这样的:

使用默认容器 iCloud.$(CFBundleIdentifier): 设备 iCloud(所有数据) 模拟器 iCloud(只能看到模拟器创建的数据)

使用自定义容器 $(TeamIdentifier)$(CFBundleIdentifier): 设备 iCloud(所有数据) 模拟器 iCloud(所有数据)

根据 iCloud 设计指南: “当您启用 iCloud Documents 或 CloudKit 功能时,Xcode 会将您的应用程序配置为访问名称基于应用程序捆绑 ID 的 iCloud 容器。大多数应用程序只需要访问默认容器。如果您的应用程序之间共享数据,启用“指定自定义容器标识符”选项并添加一个或多个容器 ID 您用来共享数据的。当应用可以访问多个容器 ID 时,访问列表中的第一个 ID 是特殊的,因为它是应用的主要 iCloud 容器。”

据我了解,每个应用程序都有自己的默认容器(名称基于应用程序的 bundleID)。例如: iCloud.com.company.myApp_free iCloud.com.company.myApp_nonfree

大多数应用只访问自己的默认容器。然而,认为 myApp_free 和 myApp_nonfree 应该使用同一个容器是合理的。然后,假设免费用户开始付费,数据仍然可以访问。因此 myApp_nonfree 将使用付费版本容器进行无忧升级。

我怀疑这只是另一个模拟器问题。如果您使用尚未迁移到 iCloud Drive 的 iCloud 帐户访问 (URLForUbiquityContainerIdentifier:containerIdentifier),iOS 8+ 的模拟器将返回一个 nil 容器。

【讨论】:

以上是关于在vs2013中,c++中set容器定义对象时,参数列表中显式调用greater无法被识别,啥原因?的主要内容,如果未能解决你的问题,请参考以下文章

无法在具有自定义运算符 ==() 的 c++ 无序集中找到用户定义的类型

C++ 21 set容器

当容器在 C++ 中为 const 时,如何对容器持有的对象进行非 const 访问

STL_关联容器 VS C++ hashmap

为啥c++的set容器的自定义比较函数要用一个结构体重载()符

STL C++ 中的容器 [关闭]