好的,所以我有一个排序的std::vector<std::pair<int,double>>. 我似乎无法找到的是如何根据 std::pair (int) 的“第一个”元素的值从向量中删除条目。我可能会在我的算法中多次执行此操作,因此我不想每次都遍历向量(其中可能包含多达一百万个条目)。我知道我们可以使用 std::erase 或 remove 轻松删除基于索引的元素,但是有没有办法根据对的第一个元素的值来执行此操作?或者我们可以获取该元素的索引然后使用 std::erase 吗?
注意: std::pair 的第一个元素的值对于向量是唯一的。鉴于程序的限制,我需要使用向量(即不能使用地图或不同的容器)。
示例:我有一个容器:
std::vector<std::pair<int,double>> vec = { {20, 60.3}, ... {10, -20.2}, {1020, -80.9}};
Run Code Online (Sandbox Code Playgroud)
我想从向量中快速删除第一个元素 == 10 的元素,但我不知道它位于向量的哪个索引处。
在c ++中对类的定义中有两个typedef.它们是为了什么?在代码中没有使用它们!
template <class T1, class T2> struct pair
{
typedef T1 first_type;
typedef T2 second_type;
T1 first;
T2 second;
pair() : first(T1()), second(T2()) {}
pair(const T1& x, const T2& y) : first(x), second(y) {}
template <class U, class V>
pair (const pair<U,V> &p) : first(p.first), second(p.second) { }
}
Run Code Online (Sandbox Code Playgroud) 我有一个Visual Studio 2008 C++应用程序,其中包含一个const char*[2]我想要转换为a的参数std::pair< std::string, std::string >.有一个简单的方法吗?
例如:
typedef std::pair< std::string, std::string > Group;
const char* a[ 2 ] = { "buzz", "foo" };
Group z = a; // ???
// a->first.c_str() == "buzz"
// a->second.c_str() == "foo"
Run Code Online (Sandbox Code Playgroud)
谢谢,PaulH
有没有办法在C中使用std :: pair和std :: make_pair?似乎它们适用于C++.
就像我用的那样
#include "utility"
Run Code Online (Sandbox Code Playgroud)
它说它找不到这样的文件
thansk任何建议
我正在尝试排序vector< pair<int,char> >但我想改变对类型的比较运算符的行为,这样如果第一个值相等并且它与(>)运算符进行比较,我希望它将第二个值与(<)运营商.
我正在努力解决" 什么是密码分析?" 关于uva的问题.这是我的方法:
string toLower(string in){
string out;
for(int i=0;i<in.length();i++){
if(in.at(i)<='Z' && in.at(i)>='A'){
out+=in.at(i)+('a'-'A');
}
else if(in.at(i)<='z' && in.at(i)>='a'){
out+=in.at(i);
}
}
return out;
}
int main(){
//freopen("in.txt","r",stdin);
//freopen("tmp.txt","w",stdout);
vector< pair<int,char> >vp;
pair<int,char> tp;
for(char a='a';a<='z';a++){//buliding a table of values and chars
tp= make_pair(0,a);
vp.push_back(tp);
}
int T;
cin >> T;
string s;
cin.ignore();
for(int i=0;i<T;i++){
getline(cin,s);
s=toLower(s);//remove special chars and convert all to lower
int l=s.length();
for(int j=0;j<l;j++){
vp[s[j]-'a'].first+=1;//increasing the value of each …Run Code Online (Sandbox Code Playgroud) 我正在尝试扩展别人的代码,它经常使用std :: queue和std :: pair类型.对于下面的代码,我需要扩展std :: pair.second中的变量数量,并希望它对于像数组这样的变量数量更加灵活(以便将来修改).
someClass->myQueue.push(std::pair<T1,uint64_t>(var1, var2));
Run Code Online (Sandbox Code Playgroud)
所以我尝试做类似的事情:
someClass->myQueue.push(std::pair<T1,uint64_t[N]>(var1,{e1,e2,...,eN}));
Run Code Online (Sandbox Code Playgroud)
在修改代码中的相关定义等后,我得到了以下错误和警告,我对此一无所知.然而,听起来这不是进行这种修改的适当方式.
myArray = myQueue.front().second;
^
error: invalid array assignment
...
someClass->myQueue.push(std::pair<T1,uint64_t[N]>(var1,{e1,e2,...,eN}));
^
warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]
Run Code Online (Sandbox Code Playgroud)
我在网上看到了元组和std :: pair作为解决方案的递归用法,但我想对代码进行最小的更改,因为几个类将受此影响.这样做的正确方法是什么?
谢谢
在我不应该用-std = c ++ 11编译的限制下,我想在以下变量中添加一个额外的变量,
std::map<unsigned,
std::map<unsigned,
std::pair<
std::pair<int, int>,
std::pair<bool, bool>
>
>
>
temp;
Run Code Online (Sandbox Code Playgroud)
并据此调整其初始化:
for (int i=0; i<100; ++i)
{
temp[i][i]=
std::pair<
std::pair<int, int>,
std::pair<bool, bool>
>
> (
std::pair<int, int> (intsX[i], intsY[i]),
std::pair<bool, bool> (boolsX[i], boolsY[i])
);
}
Run Code Online (Sandbox Code Playgroud)
我想将结构更改为:
std::map<unsigned,
std::map<unsigned,
std::pair<
std::pair<int, int>,
std::pair<
std::pair<bool, bool>,
double
>
>
>
>
temp;
Run Code Online (Sandbox Code Playgroud)
现在,我不知道如何更改初始化,例如......
for (int i=0; i<100; ++i)
{
temp[i][i]=
std::pair<
std::pair<int, int>,
std::pair<
std::pair<bool, bool>,
double
>
> (
std::pair<int, int> (intsX[i], intsY[i]),
std::pair<std::pair, …Run Code Online (Sandbox Code Playgroud) 我正在写一个小型库,它有一些API函数返回两个东西(不同类型).我宁愿不为此声明一个结构; 所以我想回来一个std::pair<foo, bat>.但是 - 也许在这些现代时代我宁愿回来std::tuple<foo, bar>呢?
更一般地说,什么时候应该优先选择元组,何时配对更合适的构造?
我不知道如何更恰当地命名这个问题,但基本上就是这样:
我做了一对pair<int, int> P[20000]和我使用P.first和P.second,但...
当我尝试输入P.first时,就像cin >> P.first[i](我是计数器)一样,它不会让我.它在编译时调用错误.我该如何解决?
编辑:得到了我之前的问题的答案,但新的问题:我正试图在P.second上运行降序排序
sort(P.second, P.second + x, greater<int>());
Run Code Online (Sandbox Code Playgroud)
但它会导致另一个编译错误.我理解为什么会这样,但我该如何解决它.基本上,说对是{{0,0}, {3,2}, {4,-1}, {5,1}}我想要的结果是{{3,2}, {5,1}, {0,0}, {4,-1}}.
我该怎么做呢?
这是我的代码.(我简化了这一点,通常有很多成员函数,但错误仍然相同,所以我简化了它.)
template <class K,class V>
class MyMap:public MySet<pair<K, V> >{};
int main(void){
MyMap<int,int> map1;
MyMap<int,int>::MyIterator it;
it=map1.begin();
cout<<it->first<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)