什么是std::pair,为什么我会使用它,以及boost::compressed_pair带来什么好处?
以下程序不会编译一组无序的整数对,但它会对整数进行编译.Can unordered_set和它的成员函数可以用在用户定义的类型上,我该如何定义它?
#include <unordered_set>
...
class A{
...
private:
std::unordered_set< std::pair<int, int> > u_edge_;
};
Run Code Online (Sandbox Code Playgroud)
编译错误:
错误:没有匹配函数来调用'std :: unordered_set> :: unordered_set()'
我有一个地图,我想在每个数据类型对象成员函数上执行调用.我还知道如何在任何序列上执行此操作但是,是否可以在关联容器上执行此操作?
我能找到的最接近的答案是:Boost.Bind访问std :: for_each中的std :: map元素.但是我不能在我的项目中使用boost,那么是否有一个STL替代品,我缺少boost :: bind?
如果不可能,我想创建一个指向数据对象的指针的临时序列,然后在其上调用for_each,如下所示:
class MyClass
{
public:
void Method() const;
}
std::map<int, MyClass> Map;
//...
std::vector<MyClass*> Vector;
std::transform(Map.begin(), Map.end(), std::back_inserter(Vector), std::mem_fun_ref(&std::map<int, MyClass>::value_type::second));
std::for_each(Vector.begin(), Vector.end(), std::mem_fun(&MyClass::Method));
Run Code Online (Sandbox Code Playgroud)
它看起来太混淆了,我真的不喜欢它.有什么建议?
在 C++17 中,如何使用可选元素声明和初始化成对(或元组)向量?
std::vector<std::pair<int, optional<bool> > > vec1 = { {1, true},
{2, false},
{3, nullptr}};
Run Code Online (Sandbox Code Playgroud)
我有一对,其中第二个元素可能为空/可选。
C++ 11具有std::minmax_element返回一对值的函数.然而,这对于处理和读取来说是相当混乱的,并且产生一个额外的,后来无用的变量来污染范围.
auto lhsMinmax = std::minmax_element(lhs.begin(), lhs.end());
int &lhsMin = *(lhsMinMax.first);
int &lhsMax = *(lhsMinmax.second);
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法吗?就像是:
int lhsMin;
int lhsMax;
std::make_pair<int&, int&>(lhsMin, lhsMax).swap(
std::minmax_element(lhs.begin(), lhs.end()));
Run Code Online (Sandbox Code Playgroud) 我想使用STL中的一对作为地图的关键.
#include <iostream>
#include <map>
using namespace std;
int main() {
typedef pair<char*, int> Key;
typedef map< Key , char*> Mapa;
Key p1 ("Apple", 45);
Key p2 ("Berry", 20);
Mapa mapa;
mapa.insert(p1, "Manzana");
mapa.insert(p2, "Arandano");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是编译器会抛出一堆不可读的信息,而且我对C和C++很新.
如何在地图中使用一对作为键?一般而言,我如何使用任何类型的结构(对象,结构等)作为地图中的键?
谢谢!
在ACM示例中,我必须构建一个用于动态编程的大表.我不得不在每个单元格中存储两个整数,所以我决定去找一个std::pair<int, int>.但是,分配大量的数组需要1.5秒:
std::pair<int, int> table[1001][1001];
Run Code Online (Sandbox Code Playgroud)
之后,我将此代码更改为
struct Cell {
int first;
int second;
}
Cell table[1001][1001];
Run Code Online (Sandbox Code Playgroud)
并且分配花了0秒.
是什么解释了这个巨大的时间差异?
这段代码:
#include <iostream>
#include <string>
std::pair<std::initializer_list<std::string>, int> groups{ { "A", "B" }, 0 };
int main()
{
for (const auto& i : groups.first)
{
std::cout << i << '\n';
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译但返回段错误。为什么?
在 gcc 8.3.0 和在线编译器上测试。