幼稚的矢量交换仅部分工作
Naive vector swapping only partially working
i有一个配对的向量<string,int>pairedv
包含数据测量名称和索引。大小至少在测试数据中,大约是780次测量,大约一半水,另一个液体一半。因为我希望该程序中的文件输出尽可能用用户友好,所以我试图将输出预设为两个部分,一个水部分和"其他"部分。
在下面代码的最后一个循环中,我有一个bool vector
掩码,适用于其相应的测量名称不包含"水"或任何常见变体时。如果bool[i]
返回True,它会增加以后使用的计数器,否则会找到下一个"水"测量值,并切换两个元素的值。
#include <algorithm>
#include <iostream>
#include <iterator>
#include <string>
#include <vector>
using namespace std;
bool IsWater(const string &str1){
if(str1.find("water")!=string::npos)
return (true);
//test file water measurements contain "*water*" only, remainder are for redundancy
if(str1.find("Water")!=string::npos)
return (true);
if(str1.find("WATER")!=string::npos)
return (true);
if(str1.find("H2O")!=string::npos)
return (true);
if(str1.find("h2o")!=string::npos)
return (true);
return false;
}
int main(int argc, char* argv[]){
//pairedv is initialized with <string,int> values
//corresponding to measurement name, index
vector<bool> boolv;
for(int i=0;i<pairedv.size();i++){
//fill bool vector with true if name contains water or variant
if(IsWater(pairedv[i].first))
boolv.push_back(true);
else
boolv.push_back(false);
}
//initialize 'x' as counter; will be used later to split std::sort into halves
int x=0;
for(int i=0;i<boolv.size();i++){
if(boolv[i])
x++; //if water, only increment x
else{ //if NOT water, swap with next "water" found
for(int i2=i+1;i2<boolv.size();i2++){
if(boolv[i2]){
string tempstr=pairedv[i].first;
int tempint=pairedv[i].second;
pairedv[i]=pairedv[i2];
pairedv[i2]=make_pair(tempstr,tempint);
}
}
}
}
//...
return 0;
}
如果我两次运行最后一个循环,它确实在"非水"测量之前对水测量进行了分类。但是,这绝对是一个最佳的解决方案。我该怎么做才能分类?
您可以使用std::partition
(或std::stable_partition
):
std::vector<std::pair<std::string, int>> pairedv /* = ...*/;
auto isPairWater = [](const auto& p) { return IsWater(p.first); };
auto it = std::partition(pairedv.begin(), pairedv.end(), isPairWater);
// water would be [pairedv.begin(); it[
// not water would be [it, pairedv.end()[
相关文章:
- 循环仅对第一行正常工作.其他行不受 for 的影响
- if-else 语句仅按特定顺序工作,我不知道为什么
- Box2D Contact Listener碰撞仅间歇性工作
- Qt5 多线程:信号仅单向工作
- Atmel Studio 7:ASF 库提供的 USART 中断处理程序仅在 main() 中遇到无限循环时工作一次?
- 模拟的 HTTP 身份验证仅在本地主机上工作
- 仅一个功能的链接错误.在同一类和CPP文件中具有相似签名的其他函数工作正常
- opengl32.lib如何在Windows(仅1.1版本)上工作?它是否真正实现了OpenGL函数
- 来自 boost 的 udp 服务器不适用于多线程,但仅在主线程上工作
- 函数指针仅在 main 内部工作
- C :SETW()仅在第一行,循环中工作
- 常量变量初始化仅与成员初始化列表一起工作
- 为什么这些标头仅在预编译的标题外工作
- 幼稚的矢量交换仅部分工作
- MPI - 当数组初始化值必须为常量时,如何为工作线程创建部分数组
- 模拟鼠标按钮按QT 5.3仅第一次工作
- 功能仅声明,但仍在工作
- 我的wlanregisternotification回调仅在回调为静态时工作
- 来自 MainWindow 中的 QDialog 全屏仅有时工作
- 不是在结构体内部工作,而是在结构体外部工作的自定义类实例