多个向量的字符串操作

时间:2013-10-20 10:12:29

标签: c++ string vector

我有三个载体

vector<string> usersA = {"a15_afd","a19_afd","a20_afd"}
vector<string> usersB = {"b15_afd","b26_afd","b98_afd"}
vector<string> usersC = {"c94_afd","c92_afd","c99_afd"}

我想检查字符a后面的数字是否存在于其他向量中。 例如:usersA索引0,是a15_254,我想检查15中是否存在其他向量usersB或usersC。

同样,我必须检查b和c之后的数字是否存在于其他向量中。 到目前为止我做了什么。将数字存储到特定的向量

     vector<string> usersANumber;  // it has the numbers of usersA {"15","19","20"}
     vector<string> usersBNumber;  // it has the numbers of usersB {"15","26","98"}
     vector<string> usersCNumber;  // it has the numbers of usersC {"94","92","99"}

我有三个for循环  第一个循环我检查其他两个向量中是否有usersANumber的数量,  第二个循环我检查另外两个向量中是否有usersBNumber的数量,  第三个循环我检查另外两个向量中是否存在usersCumber的数量

我发现这效率不高。有没有其他方法可以做到这一点

1 个答案:

答案 0 :(得分:0)

将数字存储到新的向量后,您只需要对这些向量进行排序,然后使用二进制搜索算法搜索重复的项目:

vector<string> usersA = { "15", "19", "20" };
vector<string> usersB = { "15", "26", "98" };
vector<string> usersC = { "94", "92", "99" };

sort(usersA.begin(), usersA.end());
sort(usersB.begin(), usersB.end());
sort(usersC.begin(), usersC.end());

searchForDuplicateItems(usersA, usersB);
searchForDuplicateItems(usersA, usersC);
searchForDuplicateItems(usersB, usersC);

请注意,您只需要比较一次矢量,即在浏览了矢量 usersA 的所有项目后检查它们是否存在于矢量 usersB 中,没有必要浏览向量 usersB 的所有项目,检查它们是否存在于向量 usersA 中。

searchForDuplicateItems 函数实现如下所示:

void searchForDuplicateItems(vector<string> &v1, vector<string> &v2)
{
    for (int i = 0; i < v1.size(); i++)
    {
        if (vectorContainsItem(v2, v1[i]))
        {
            // duplicate item found
        }
    }
}

这里是 vectorContainsItem 函数的实现,它在内部使用二进制搜索算法来提高效率:

bool vectorContainsItem(vector<string> &v, string &item)
{
    int left = 0;
    int right = (int) v.size() - 1;
    int mid = (right + left) / 2;

    while (left <= right)
    {
        mid = (right + left) / 2;
        if (v[mid].compare(item) == 0)
            return true;
        else if (v[mid].compare(item) < 0)
            left = mid + 1;
        else if (v[mid].compare(item) > 0)
            right = mid - 1;
    }

    return false;
}