标签: std-pair

使用std :: pair或std :: tuple的移动语义

假设你想利用移动语义,但你的一个可移动类需要成为一部分std::pair.目的是创建一个函数,该函数返回一个std::pair可被视为右值并转发的函数.

但我无法看到如何做到这一点,除非对其std::pair自身进行内部更改,以使其了解移动语义.

请考虑以下代码:

struct Foo
{
 Foo() { }

 Foo(Foo&& f) { }

 private:

 Foo(const Foo& f) { } // do not allow copying
};

int main() 
{
 Foo f;
 std::pair<Foo, int> res = std::make_pair(f, 10); // fails due to private copy constructor
}
Run Code Online (Sandbox Code Playgroud)

问题是std::make_pair,除了std::pair构造函数本身之外,还需要两个对象并尝试制作它们的内部副本.这导致它尝试并调用复制构造函数.但在我的例子中,我希望能够新对移动res,并确保不会制作副本.我认为除非std::pair自己在内部定义了以下构造函数,否则这是不可能的:

pair(T1&& t1, T2&& t2) : first(std::move(t1)), second(std::move(t2))
Run Code Online (Sandbox Code Playgroud)

但它没有,至少在我使用的编译器上没有(gcc 4.3.2).这可能是因为我的编译器是简单地外的日期,而事实上新版本拥有这一举动感知构造.但是我对移动语义的理解目前有点不稳定,所以我不确定我是否只是在这里忽略了一些东西.那么,我是否正在努力实现,而不是实际重新实现std::pair?或者我的编译器是否已过时?

c++ move-constructor move-semantics c++11 std-pair

20
推荐指数
1
解决办法
1万
查看次数

为什么std :: equal_to会导致动态分配?

考虑以下简单示例,我用它std::equal_to来比较两个std::pair<std::string, unsigned>.它operator new被重载,以便在分配时打印一条消息(此处为实时代码):

#include <functional>
#include <string>
#include <iostream>

// overloaded to see when heap allocations take place
void* operator new(std::size_t n)
{
    std::cout << "Allocating " << n << std::endl;
    return malloc(n);
}

int main()
{
    using key_type = std::pair<std::string, unsigned>;
    auto key1 = std::make_pair(std::string("a_______long______string______"), 1);
    auto key2 = std::make_pair(std::string("a_______long______string______"), 1);

    std::cout << "Finished initial allocations\n\n" << std::endl;

    std::equal_to<key_type> eq;
    eq(key1, key2); // how can this cause dynamic allocation???
}
Run Code Online (Sandbox Code Playgroud)

我看到的信息是 …

c++ heap-memory std-pair

20
推荐指数
1
解决办法
1149
查看次数

C++ std :: transform of pairs-> first to new vector

对不起有点初学者的问题.有矢量和矢量对

typedef std::vector <int> TItems;
typedef std::vector < std::pair <int, int> > TPairs;
Run Code Online (Sandbox Code Playgroud)

有没有办法在一步中将对中的所有第一项转换为另一个向量

int main ()
{
TItems items;
TPairs pairs;

pairs.push_back (std::make_pair(1,3));
pairs.push_back (std::make_pair(5,7));

std::transform( items.begin(), items.end(), items.begin(), comp ( &pairs ) );

return 0;
}
Run Code Online (Sandbox Code Playgroud)

如何设计仿函数?

class comp
{
private:
     TPairs *pairs;

public:
    comp ( TPairs  *pairs_ ) : pairs ( pairs_) { }

    unsigned int operator () ( const unsigned int index ) const
    {
        return  (*pairs)[index].second != pairs->end();  //Bad idea
    }
};
Run Code Online (Sandbox Code Playgroud)

也许有一些没有lambda表达式和循环的用户友好方法.谢谢你的帮助.

c++ transform vector functor std-pair

19
推荐指数
3
解决办法
2万
查看次数

pair <int,int>对作为unordered_map问题的关键

我的代码:

 typedef pair<int,int> Pair
  tr1::unordered_map<Pair,bool> h;
  h.insert(make_pair(Pair(0,0),true));
Run Code Online (Sandbox Code Playgroud)

Erorr

 undefined reference to `std::tr1::hash<std::pair<int, int> >::operator()(std::pair<int, int>) const'
Run Code Online (Sandbox Code Playgroud)

我需要修理什么?

谢谢

c++ unordered-map std-pair

17
推荐指数
2
解决办法
2万
查看次数

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

基于前一个问题,我试图使用一对整数作为关键创建一个映射,即map<pair<int, int>, int>我找到了有关如何插入的信息:

#include <iostream>
#include <map>

using namespace std;

int main ()
{
map<pair<int, int>, int> mymap;

mymap.insert(make_pair(make_pair(1,2), 3)); //edited
}   
Run Code Online (Sandbox Code Playgroud)

但我似乎无法访问该元素!我试过cout << mymap[(1,2)] << endl;但它显示错误,我找不到有关如何使用密钥访问元素的信息.难道我做错了什么?

c++ map std-pair

17
推荐指数
3
解决办法
3万
查看次数

比较两个map :: iterators:为什么需要std :: pair的拷贝构造函数?

下面非常简单的代码在C++ 98中编译和链接而没有警告,但在C++ 11模式下给出了一个难以理解的编译错误.

#include <map>

struct A {
    A(A& ); // <-- const missing
};

int main() {
    std::map<int, A> m;
    return m.begin() == m.end(); // line 9
}
Run Code Online (Sandbox Code Playgroud)

错误-std=c++11是,gcc版本4.9.0 20140302(实验)(GCC):


ali@X230:~/tmp$ ~/gcc/install/bin/g++ -std=c++11 cctor.cpp 
In file included from /home/ali/gcc/install/include/c++/4.9.0/bits/stl_algobase.h:64:0,
                 from /home/ali/gcc/install/include/c++/4.9.0/bits/stl_tree.h:61,
                 from /home/ali/gcc/install/include/c++/4.9.0/map:60,
                 from cctor.cpp:1:
/home/ali/gcc/install/include/c++/4.9.0/bits/stl_pair.h: In instantiation of ‘struct std::pair’:
cctor.cpp:9:31:   required from here
/home/ali/gcc/install/include/c++/4.9.0/bits/stl_pair.h:127:17: error: ‘constexpr std::pair::pair(const std::pair&) [with _T1 = const int; _T2 = A]’ declared to take const reference, but implicit declaration would …

c++ gcc clang c++11 std-pair

17
推荐指数
1
解决办法
3241
查看次数

将std :: map复制到std :: vector of pairs中

我正在尝试将地图复制到对的向量中,因此我可以通过对的second数据成员对向量进行排序.我已经解决了这样做:

void mappedWordsListSorter(){
  for (auto itr = mappedWordsList.begin(); itr != mappedWordsList.end(); ++itr){
    vectorWordsList.push_back(*itr);
  }
  sort(vectorWordsList.begin(), vectorWordsList.end(), [=](pair<string, int>& a, pair<string, int>& b){return a.second > b.second;});
}
Run Code Online (Sandbox Code Playgroud)

我需要找到一种方法来实现这一点而不使用原始循环,而是使用标准库.我通过传递地图的键或值来遇到很多例子.我需要复制到一个矢量pairs<string, int>.最好的方法是什么?

c++ stdmap stdvector c++-standard-library std-pair

17
推荐指数
3
解决办法
1272
查看次数

std::pair&lt;auto, auto&gt; 返回类型

我在玩autoin std::pair。在下面的代码中,函数f应该返回std::pair依赖于模板参数的类型。

一个工作示例:

例 1

template <unsigned S>
auto f()
{
    if constexpr (S == 1)
        return std::pair{1, 2}; // pair of ints
    else if constexpr (S == 2)
        return std::pair{1.0, 2.0}; // pair of doubles
    else
        return std::pair{0.0f, 0.0f}; // pair of floats
}
Run Code Online (Sandbox Code Playgroud)

这适用于 gcc 9.2、gcc 10.0、clang 9.0 和 clang 10.0。

接下来,std::pair为了清楚起见,我想明确地将返回类型写为 a :

例2

template <unsigned S>
std::pair<auto, auto> f()
{
    if constexpr (S == 1)
        return {1, …
Run Code Online (Sandbox Code Playgroud)

c++ constexpr auto std-pair c++17

17
推荐指数
1
解决办法
1715
查看次数

STL地图插入效率:[]与插入

地图插入有两种方式:

m[key] = val;
Run Code Online (Sandbox Code Playgroud)

要么

m.insert(make_pair(key, val));
Run Code Online (Sandbox Code Playgroud)

我的问题是,哪个操作更快?人们通常说第一个较慢,因为如果'key'在map中不存在,STL Standard首先'插入'一个默认元素,然后将'val'分配给默认元素.

但由于'make_pair',我没有看到第二种方式更好.make_pair实际上是一种方便的方式来制作'对' pair<T1, T2>(key, val).无论如何,他们都做了两个任务,一个是将'key'分配给'pair.first',两个分配'val'给'pair.second'.完成配对后,map将插入由'pair.second'初始化的元素.

所以第一种方式是1.' default construct of typeof(val)'2.分配第二种方式是1.赋值2.' copy construct of typeof(val)'

c++ stl insert map std-pair

16
推荐指数
2
解决办法
7788
查看次数

排序对的向量

Heyho,

我有一个关于排序对矢量的问题:

std::vector<std::pair<double,Processor*>> baryProc;
Run Code Online (Sandbox Code Playgroud)

这个向量已经填满了对.现在我想根据对中的double值对向量内的对进行排序

例:

假设我在向量内有3对.pair1在前面,第3对在前面.pair2在中间:

pair1(1, proc1) 
pair2(3, proc2)
pair3(2.5, proc3)
Run Code Online (Sandbox Code Playgroud)

现在我想根据double值对对进行排序.这样向量内的顺序是:

pair1(1, proc1) 
pair3(2.5, proc3)
pair2(3, proc2)
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做?我很困惑.

谢谢您的帮助

c++ sorting vector std-pair

16
推荐指数
2
解决办法
6万
查看次数