草庐IT

evth-pair

全部标签

c++ - std::pair: 过于严格的构造函数?

我偶然发现了新的std::pair的一个令人惊讶的行为。构造函数,它是在C++11中引入的。我在使用std::pair>时发现了这个问题,它发生了,因为std::atomic既不能复制也不能移动。在下面的代码中,我替换了std::atomic与foobar为了简化。以下代码编译良好,使用GCC-4.9和Clang-3.5(有和没有libc++):structfoobar{foobar(int){}//implicitconversion//foobar(constfoobar&)=delete;};std::pairp{1,2};这种行为是预期的。但是,当我删除foobar的复制构造函

c++ - 有没有一种方便的方法可以将 std::pair 包装为新类型?

我经常发现自己使用std::pair将两个相关量的逻辑分组定义为函数参数/返回值。一些示例:行/列、标签/值等。很多时候我真的应该滚动我自己的类(class),而不是仅仅使用std::pair。当事情开始崩溃时很容易看出——当代码中到处都是make_pair时,首先,其次,很难记住什么是什么——std::pair比类型Position传达更少的含义.您发现了将std::pair的功能封装在传达真实含义的类型中的最佳方法是什么?以下是我考虑过的一些事情:typedefstd::pairPosition;这至少在传递类型时为类型提供了一个有意义的名称,但类型不是强制的,它实际上仍然只是一对

c++ - 为什么 `initializer_list<pair>` 和 `initializer_list<tuple>` 的行为不同?

以下代码编译并运行:#include#include#include#includevoidext(std::initializer_list>>myList){//Dosomething}///////////////////////////////////////////////////////////intmain(void){ext({{1.0,{2.0,3.0,4.0}}});return0;}虽然这个没有:#include#include#include#includevoidext(std::initializer_list>>myList){//Dosomething}

c++ - 为什么 std::pair 没有迭代器?

为什么std::pair没有迭代器?std::pair应该提供iterator和const_iterator以及begin()和end()--只针对他们的两个成员。我认为这会很有用,因为这样我们可以将它们传递给期望可迭代的模板函数,例如vector或set。这样做有什么缺点吗? 最佳答案 一个原因是一对中的两个元素可以是不同的类型。这不适合迭代器模型。元组也是如此,拥有迭代器可能会更有吸引力。如果您需要一个固定长度的廉价同质容器,您可以使用std::array. 关于c++-为什么std

c++ - 按字符串对 std::vector<std::pair<std::string,bool>> 进行排序?

我如何通过比较pair.first这是一个std::string来对这个vector进行排序?(不提供静态比较功能,也不使用boost)。 最佳答案 std::vector>v;std::sort(v.begin(),v.end());std::pair过载operator首先按first排序元素然后由second元素。因此,如果您只是对vector进行排序使用默认排序顺序(operator),您将获得所需的顺序。 关于c++-按字符串对std::vector>进行排序?,我们在Stac

c++ - 将 std::pair<T1, T2> const 转换为 std::pair<T1 const, T2> const 安全吗?

reinterpret_cast是否安全(理论上或实际上)一个std::pairconst&变成std::pairconst&,假设程序员没有故意做一些奇怪的事情,比如专门std::pair? 最佳答案 这样做并不便携。std::pair要求在第20.3节中列出。第17.5.2.3条阐明了Clauses18through30andAnnexDdonotspecifytherepresentationofclasses,andintentionallyomitspecificationofclassmembers.Animplemen

c++ - 我应该在哪里为我的 std::pair 特化定义运算符 >>?

考虑以下程序:#include#include#include#includeusingnamespacestd;//justforconvenience,illustrationonlytypedefpairpoint;//thisismyspecializationofpair.Icallitpointistream&operator>>(istream&in,point&p){returnin>>p.first>>p.second;}intmain(){vectorv((istream_iterator(cin)),istream_iterator());//^^^^^^//ex

c++ - 以 std::pair 作为键创建 std::unordered_map

我正在尝试创建一个以std::pair作为键的std::unordered_map。你可以想象,这需要我显式地提供一个类来为给定的键生成哈希,以及键的相等比较器。到目前为止,这是我的代码:#include#include#includetemplatestructPairHash{size_toperator()(conststd::pair&key){returnstd::hash()(key.first)^std::hash()(key.second);}};templatestructPairEqual{booloperator()(conststd::pair&lhs,cons

c++ - 我可以使用 std::pair,但重命名 .first 和 .second 成员名称吗?

我遇到的一个常见设计问题是,我将两个变量捆绑在一起,然后失去以有意义的方式引用它们的能力。std::paircords;cord.first=0;//is.firstthexorycoordinate?cord.second=0;//is.secondthexorycoordinate?我考虑过编写基本结构,但是我失去了很多std::pair:带来的好处make_pair非成员重载运算符交换得到等等有没有办法为first和second数据成员重命名或提供替代标识符?我希望利用所有接受std::pair的函数,但仍然可以通过以下方式使用它们:std::paircords;//specia

c++ - 使用 pair<int, int> 作为 map 的键

基于previousquestion,我正在尝试使用一对整数作为键创建映射,即map,int>我找到了有关如何插入的信息:#include#includeusingnamespacestd;intmain(){map,int>mymap;mymap.insert(make_pair(make_pair(1,2),3));//edited}但我似乎无法访问该元素!我试过cout但它显示错误,我找不到有关如何使用key访问元素的信息。我做错了吗? 最佳答案 您需要一对作为keycout您目前拥有的cout语法不正确。