有没有一个很好的理由为什么Pair<L,R>Java中没有?这个C++构造的等价物是什么?我宁愿避免重新实现自己.
似乎1.6提供类似的东西(AbstractMap.SimpleEntry<K,V>),但这看起来很复杂.
我很感兴趣:C#std::pair在C++中的模拟是什么?我找到了System.Web.UI.Pair课程,但我更喜欢基于模板的课程.
谢谢!
目的是std::make_pair什么?
为什么不std::pair<int, char>(0, 'a')呢?
这两种方法有什么区别吗?
我已经确定了四种不同的插入方式std::map:
std::map<int, int> function;
function[0] = 42;
function.insert(std::map<int, int>::value_type(0, 42));
function.insert(std::pair<int, int>(0, 42));
function.insert(std::make_pair(0, 42));
Run Code Online (Sandbox Code Playgroud)
哪一种是首选/惯用的方式?(还有另一种我没想过的方法吗?)
a std::pair和std::tuple只有两个成员之间有区别吗?(除了明显std::pair需要两个,只有两个成员,tuple可能会少...)
我刚刚发现,在某一点上,C++ 11草案具有std::begin/ std::end重载std::pair,允许将一对迭代器视为适合在基于范围的for循环中使用的范围(N3126,第20.3.5.5节),但这有自从被删除.
有谁知道为什么它被删除了?
我发现删除非常不幸,因为似乎没有其他方法可以将一对迭代器视为范围.确实:
std::pair 没有开始/结束成员函数std::pair<T, U>是namespace stdstd::begin/ std::end为std::pair自己std::begin/ std::endfor std::pair(因为专业化必须是部分的,而且不允许使用函数)还有其他一些我失踪的方式吗?
我有一个vector的pair像这样的:
vector<pair<string,double>> revenue;
Run Code Online (Sandbox Code Playgroud)
我想在地图中添加一个字符串和一个double,如下所示:
revenue[i].first = "string";
revenue[i].second = map[i].second;
Run Code Online (Sandbox Code Playgroud)
但由于收入未初始化,因此出现了出界错误.所以我尝试使用vector::push_back这样的:
revenue.push_back("string",map[i].second);
Run Code Online (Sandbox Code Playgroud)
但那说不能采取两个论点.那么,如何可以添加到这个vector的pair?
所以我有这样的地图:
map<string, pair<string,string> > myMap;
Run Code Online (Sandbox Code Playgroud)
我使用以下方法在地图中插入了一些数据:
myMap.insert(make_pair(first_name, make_pair(middle_name, last_name)));
Run Code Online (Sandbox Code Playgroud)
我的问题是,如何打印出地图中的所有数据?请举例说明我的参考.
我试图std::pair用这种风格制作:
#include <iostream>
struct A {
A() noexcept {
std::cout << "Created\n";
}
A(const A&) noexcept {
std::cout << "Copy\n";
}
A(A&&) noexcept {
std::cout << "Move\n";
}
};
int main() {
std::pair<A, A> a{ {},{} };
return 0;
}
Run Code Online (Sandbox Code Playgroud)
并得到这样的输出:
Created
Created
Copy
Copy
Run Code Online (Sandbox Code Playgroud)
代替
Created
Created
Move
Move
Run Code Online (Sandbox Code Playgroud)
但是如果我定义我的匿名对象类型(例如std::pair<A, A> a{A{}, A{}})或使用std::make_pair<A, A>({}, {})我得到正确的结果。
std::pair构造函数必须使用std::forward<U1>和std::forward<U2>来初始化对象,因此我认为我的配对使用了错误的构造函数。为什么?
这是测试代码.
元组测试:
using namespace std;
int main(){
vector<tuple<int,int>> v;
for (int var = 0; var < 100000000; ++var) {
v.push_back(make_tuple(var, var));
}
}
Run Code Online (Sandbox Code Playgroud)
配对测试:
#include <vector>
using namespace std;
int main(){
vector<pair<int,int>> v;
for (int var = 0; var < 100000000; ++var) {
v.push_back(make_pair(var, var));
}
}
Run Code Online (Sandbox Code Playgroud)
我通过Linux time命令进行了时间测量.结果是:
| | -O0 | -O2 |
|:------|:-------:|:--------:|
| Pair | 8.9 s | 1.60 s |
| Tuple | 19.8 s | 1.96 s |
Run Code Online (Sandbox Code Playgroud)
我想知道,为什么O0中的这两个数据结构之间存在如此大的差异,因为它们应该非常相似.02中只有一点不同.
为什么O0的差异如此之大,为什么会有任何差异呢?
编辑:
v.resize()的代码
对:
#include …Run Code Online (Sandbox Code Playgroud)