订购一系列字符串,同时避免重复

Ordering an array of strings while avoiding duplicates

本文关键字:一系列 字符串      更新时间:2023-10-16

所以说我有:

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 << ' ';
}