订购一系列字符串,同时避免重复
Ordering an array of strings while avoiding duplicates
所以说我有:
string array1[5] = {"A", "B", "C", "D", "F"};
string array2[5] = {"A", "C", "G", "F", "D"};
string result[100];
我正在尝试使字符串结果[100]从array1和array2组成,而array1和array2的顺序是array1 [0],然后array2 [0],然后array1 [1],然后array2 [1]等
(例如)string result[100] = {"A", "B", "C", "G", "D", "F"};
这是我迄今为止的代码:
for (i=0; i < 5; i++) {
result[i] = array2[i];
}
for (i=0; i<5; i++) {
for (j=0; j<100; j++) {
if (result[j] == "") {
result[j] = array1[i];
break;
}
if (result[j] == array1[i]) break;
}
}
此代码避免重复,但我想要的顺序不正确。我无法缠绕解决这个问题。任何帮助将不胜感激。
完全工作,我只是写了。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main(){
string array1[5]= {"A","B","C","D","F"};
string array2[5]= {"A","C","G","F","D"};
vector<string> result;
bool check1;
bool check2;
for(int i=0; i<sizeof(array1)/sizeof(array1[0]);i++){
bool check1= check2= false;
if(result.size() == 0 && array1[i] != array2[i]){
result.push_back(array1[i]);
result.push_back(array2[i]);
}
else if(result.size() == 0 && array1[i] == array2[i]){
result.push_back(array1[i]);
}
else {
for(int j=0; j<result.size(); j++){
if(array1[i] == result[j])
check1= true;
}
if(!check1)
result.push_back(array1[i]);
for(int j=0; j<result.size(); j++){
if(array2[i] == result[j])
check2= true;
}
if(!check2)
result.push_back(array2[i]);
}
}
for(vector<string>::iterator it= result.begin(); it != result.end(); it++){
cout<<*it<<" ";
}
cout<<endl;
return 0;
}
以下方法创建了std::map
,因此只保留唯一的字符串,但也存储索引,以便在正确的序列中使用元素创建第二个映射。
#include <string>
#include <vector>
#include <iostream>
#include <map>
int main()
{
std::vector<std::vector<std::string>> vec{
{"A", "B", "C", "D", "F", "W"},
{"A", "C", "G", "F", "D"}};
using Index = std::pair<size_t, size_t>;
std::map<std::string, Index> intermediate;
for(size_t row{}; row < vec.size(); ++row)
for(size_t element{}; element < vec[row].size(); ++element)
intermediate.insert(std::make_pair( // Won't overwrite
vec[row][element], // Insert string in map
Index{element, row})); // Store index for sequencing
std::map<Index, std::string> result;
for(auto&&[string, index] : intermediate) // C++17 structured bindings
result[index] = string; // Map sorts by original position
for(auto& element : result)
std::cout << element.second << ' ';
}