在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();
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++ 中为 const 时,如何对容器持有的对象进行非 const 访问