如何通过字符串中的每个字符推进迭代器c ++

时间:2015-11-12 03:36:21

标签: c++ iterator

我感到困惑的是,我有一个地图,它由size_t of string作为键,字符串作为值。

$scope.sendATSError = function (applicant) {
    return AtsintegrationsService.applicantErrorHandling(applicant.dataset.atsApplicantID); // `return` is potentially important.
};

然后我有一对存储大小为4的所有字符串的equal_range。然后我想迭代该equal_range的开头到该equal_range的结尾。开始是我的pair.first和end是我的pair.second。我如何遍历我的pair.first指向的每个字符,然后将它与pair.first和pair.second之间的每个字进行比较?

std::multimap<size_t, std::string> wordMap;

基本上我想将word1中的每个字母与word2中的每个字符进行比较。 将word2推进到下一个单词并将其中的每个字母与word1中的每个字母进行比较。对每个单词执行此操作,然后将word1将word1转换为另一个单词,并将其与每个单词进行比较。 我如何得到itr2指向的每个角色?我认为第一个for循环完成了第一个迭代器,但我不知道如何为itr2做。

pair<multimap<size_t, string>::iterator, multimap<size_t, string>::iterator> key_range;
key_range = wordMap.equal_range(n);

我想将每个单词中的每个字母相互比较,只要它们具有相同的字符串大小即可。然后,如果命中== 1,这意味着单词只有1个字符,它们应该被映射或存储在某种类型的STL容器中,这些容器将它们分组。我还是STL的新手,所以我在考虑一套,但我需要阅读更多内容。

2 个答案:

答案 0 :(得分:1)

首先,如果您提供了一个最小的可编辑示例,您将更有可能获得帮助。我假设你的答案是std::string s,但你知道他们对假设的看法。

Boost这样的算法在{{3}}中实现,专门用于同时迭代多个集合,但我认为标准库中没有任何可比性。

一种简单但令人不快的繁琐方法就是手动迭代两个字符串。这将输出两个单词中的每个字母,直到任何一个单词结束,或者存在差异。

注意所有繁琐的部分:你需要确保两个迭代器始终有效,以防一个单词在另一个单词之前结束,并确定实际发生的事情有点麻烦。

#include <string>
#include <iostream>

int main()
{
    std::string word1 = "capsicum";
    std::string word2 = "capsicube";

    std::string::iterator it1 = word1.begin();
    std::string::iterator it2 = word2.begin();

    while (it1 != word1.end() && it2 != word2.end())
    {
            // characters are different!
            if (*it1 != *it2)
                    break;

            // characters are the same
            std::cout << "Both have: " << *it1 << std::endl;

            // advance both iterators
            ++it1;
            ++it2;
    }

    if (it1 == word1.end() && it2 == word2.end())
    {
            std::cout << "Words were the same!" << std::endl;
    }
    else if (it1 == word1.end())
    {
            std::cout << "Word 1 was shorter than word 2." << std::endl;
    }
    else if (it2 == word2.end())
    {
            std::cout << "Word 1 was longer than word 2." << std::endl;
    }
    else
    {
            std::cout << "Words were different after position " << (it1 - word1.begin())
                      << ": '" << *it1 << "' vs '" << *it2 << "'" << std::endl;
    }
}

答案 1 :(得分:0)

新答案,因为问题已得到重大更新。我仍然不确定这会完全符合您的要求,但我认为您应该能够使用它来到达您想去的地方。

我把它写成minimal, complete, verifiable example,理想情况下你应该如何提出问题。为了简洁/可读性,我还使用了C ++ 11功能。

希望内联评论能够充分解释您至少能够对您不完全理解的任何事情进行自己的研究,但如果您有任何其他问题,请随时发表评论。基本思想是存储第一个单词(使用key_range.first迭代器),然后使用std::next()跟随迭代器开始迭代,直到我们到达{的最后迭代器{1}}。

然后,我们在循环之外给出key_pair.second,并在循环中将word1设置为列表中的每个其他单词。然后我们使用我在其他答案中发布的“双重交互”技术来逐字符地比较每个单词。

word2