标签: std-pair

如何在C++中存储一对数字?

我正在尝试学习C++,现在我正在编写一个需要输出整数对列表的程序.

处理这个问题的最佳方法是什么?我在学校的linux电脑上没有可用的升级库,所以我不相信我可以使用boost :: tuple.

有什么建议?

c++ stl std-pair

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

在 C++ 中从单个向量创建对向量

我有一个偶数大小的向量,我想将其转换为成对的向量,其中每对始终包含两个元素。我知道我可以使用简单的循环来做到这一点,但我想知道是否有一个很好的标准库工具可以做到这一点?可以假设原始向量始终包含偶数个元素。

例子:

vector<int> origin {1, 2, 3, 4, 5, 6, 7, 8};

vector<pair<int, int>> goal { {1, 2}, {3, 4}, {5, 6}, {7, 8} };
Run Code Online (Sandbox Code Playgroud)

c++ stl std stdvector std-pair

25
推荐指数
3
解决办法
2213
查看次数

在C++中将变量名转换为字符串

我想将一些数据输出到文件中.例如假设我有两个双打向量:

vector<double> data1(10);
vector<double> data2(10); 
Run Code Online (Sandbox Code Playgroud)

是否有一种简单的方法将其输出到文件,以便第一行包含标题'data1'和'data2',后跟实际内容.输出数据的函数将传递各种不同的数组,因此不可能硬编码标题的名称 - 理想情况下,我想将变量名称转换为某个字符串,然后输出该字符串,后跟向量数组的内容.但是,我不确定如何将变量名'data1'转换为字符串,或者确实如果它可以很容易地完成(从阅读论坛我的猜测是不可以)如果这是不可能的替代可能是使用关联容器(如map)或更简单的"对"容器.

pair<vector<double>,string> data1(10,'data1');  
Run Code Online (Sandbox Code Playgroud)

欢迎大家提出意见!

c++ string variables map std-pair

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

使用std :: tie作为循环目标的范围

我想做类似以下的事情:

//std::vector<std::pair<TypeA, TypeB>> someInitializingFunction();
{
  TypeA a;
  TypeB b;

  for (std::tie(a, b) : someInitializingFunction()) {
    // do stuff;
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,这不是有效的代码,因为正如标准所说,基于for循环的范围被定义为等效于:

{
  auto && __range = range-init;
  for ( auto __begin = begin-expr,
      __end = end-expr;
      __begin != __end;
      ++__begin ) {
    for-range-declaration = *__begin;
    statement
  }
}
Run Code Online (Sandbox Code Playgroud)

其中for-range-declaration定义为:

for-range-declaration:attribute-specifier-seq_ {opt} decl-specifier-seq声明符

那么阻碍我的是decl-specifier-seq没有标记为可选的?

因此,似乎我必须依靠旧式的循环来实现这个问题:

std::vector<std::pair<TypeA, TypeB>> myList = someInitializingFunction();

{
  TypeA a;
  TypeB b;

  for (auto it = myList.begin(); it != myList.end(); ++it) {
    std::tie(a, b) = *it;
    // do …
Run Code Online (Sandbox Code Playgroud)

c++ for-loop tie language-lawyer std-pair

24
推荐指数
2
解决办法
5772
查看次数

结构有2个单元格vs std :: pair?

可能重复:
使用带有两个字段和一对的结构有什么区别?

亲爱的大家,

关于对和结构,我有一个小问题.使用std :: pair而不是带有两个单元格的结构有什么好处吗?我已经使用了一段时间,但主要的问题是可读性:如果你想表示例如一个双重(int"标签",双"值")你可以使用a:

typedef std::pair<int,double> myElem;
Run Code Online (Sandbox Code Playgroud)

或者a

typedef struct {
    int label;
    double value;
} myElem;
Run Code Online (Sandbox Code Playgroud)

如果你的语句具有"语义"意义,那么代码就会变得更具可读性(你将永远知道x.label是什么.这与x.first不同).

但是,我猜使用pair有一个优势.它更高效还是其他什么?

c++ struct std-pair

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

为什么我需要在map :: emplace中使用piecewise_construct用于不可复制对象的单个arg构造函数?

以下代码不会在gcc 4.8.2上编译.问题是此代码将尝试复制构造,std::pair<int, A>这是由于struct A缺少复制和移动构造函数而无法发生的.

gcc在这里失败了还是我错过了什么?

#include <map>
struct A
{
  int bla;
  A(int blub):bla(blub){}
  A(A&&) = delete;
  A(const A&) = delete;
  A& operator=(A&&) = delete;
  A& operator=(const A&) = delete;
};
int main()
{
  std::map<int, A> map;
  map.emplace(1, 2); // doesn't work
  map.emplace(std::piecewise_construct,
          std::forward_as_tuple(1),
          std::forward_as_tuple(2)
  ); // works like a charm
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ map c++11 std-pair emplace

22
推荐指数
1
解决办法
6260
查看次数

我应该如何大括号初始化std :: pairs的std :: array?

std::array<std::pair<int, int>, 2> ids = { { 0, 1 }, { 1, 2 } };
Run Code Online (Sandbox Code Playgroud)

VS2013错误:

错误C2440:'初始化':无法从'int'转换为'std :: pair'没有构造函数可以采用源类型,或构造函数重载解析是不明确的

我究竟做错了什么?

c++ c++11 std-pair list-initialization stdarray

22
推荐指数
2
解决办法
8174
查看次数

是否存在std :: tie for std :: pair之类的东西?

例如,使用元组:

#include <tuple>        // std::tuple, std::make_tuple, std::tie

int num;
char letter;
std::tuple<int,char> num_letter;

num_letter = std::make_tuple(10, 'a');
std::tie(num, letter) = num_letter;  // unpack num_letter into num and letter
Run Code Online (Sandbox Code Playgroud)

有没有相当于对的东西?

// ...
num_letter = std::make_pair(10, 'a');
std::pair_tie(num, letter) = num_letter;
Run Code Online (Sandbox Code Playgroud)

c++ std c++11 std-pair

22
推荐指数
1
解决办法
7912
查看次数

配对优先级队列

我正在尝试将对存储在优先级队列中,并且我使用比较函数来比较每对的第二个值.

#include<iostream>
#include<queue>
#include<utility>
using namespace std;

class CompareDist
{
public:
    bool operator()(pair<int,int> n1,pair<int,int> n2) {
        return n1.second>n2.second;
    }
};
int main()
{
    priority_queue<pair<int,int>,CompareDist> pq;
}
Run Code Online (Sandbox Code Playgroud)

当我编译这个时,我得到一个错误

error: no type named ‘value_type’ in ‘class CompareDist’
Run Code Online (Sandbox Code Playgroud)

可能是什么原因.我是STL的新手.

c++ stl priority-queue std-pair

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

使用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万
查看次数