C++ 如何在char向量中插入整型向量值

C++ 如何在char向量中插入整型向量值,c++,stdvector,C++,Stdvector,对于“alpha”输入,我的函数需要输出一个值“a2l1p1h1a2”。 然而,我面临着将整数值从整数向量插入到字符向量的问题。 下面是代码片段。非常感谢您的任何建议/建议/观察 void stringCharCount(string inStr) { unsigned int i = 0, j = 0, count = 0; vector<char> charVect; vector<int> charCount; vector<c

对于“alpha”输入,我的函数需要输出一个值“a2l1p1h1a2”。 然而,我面临着将整数值从整数向量插入到字符向量的问题。 下面是代码片段。非常感谢您的任何建议/建议/观察

void stringCharCount(string inStr)
{
    unsigned int i = 0, j = 0, count = 0;
    vector<char> charVect;
    vector<int> charCount;
    vector<char> charnCount;

    vector<char> :: iterator itr1;
    vector<int> :: iterator itr2;
    vector<char> :: iterator itr3;

    string inpStr = inStr;

    for(i = 0; i < inpStr.length(); i++)
    {
        //Push each character of the string into the vector
        charVect.push_back(inpStr.at(i));

        // Count the number of occurrences of each character in the string
        for(j = 0 ; j < inpStr.length(); j++)
        {
            if(inpStr.at(i) == inpStr.at(j))
            {
                count++;
            }
        }
        charCount.push_back(count);
        count = 0; // Reset for counting the next character's count
    }

    for(itr1 = charVect.begin(), itr2 = charCount.begin(); itr1 != charVect.end(), itr2 != charCount.end(); itr1++, itr2++)
    {
        cout << "Char: " << *itr1 << " ";
        cout << "Char count: " << *itr2 << endl;
        charnCount.push_back(*itr1);
        char tempChar = static_cast<char> (*itr2);
        charnCount.push_back(tempChar);  // THIS LINE DOES NOT SEEM TO WORK!!
        cout << "Char count: " << *itr2 << endl;
    }

    for(itr3 = charnCount.begin(); itr3 != charnCount.end(); itr3++)
    {
        cout << "Char, its count: " << *itr3 << endl;
    }
}
您不需要charVect和inpStr来存储inStr的额外副本。 对于charnCount,string似乎比vector好,因为计数可能会超过128,并且附加到string要简单得多。如果您打印char1,它将不打印任何内容而不是“1”,因为1在ASCII中表示标题的开始,“1”实际上是49。您必须按照@tadman在评论中所说的做,或者使用std::to_string将其转换为字符串。 使用而不是迭代器。更清楚了。它也适用于字符串。 对于向量使用而不是推回,速度更快。但是对于std::vector,没有任何不同。但是,如果向量包含其他对象,我建议使用emplace_back而不是push_back
我建议首先使用地图计算字符数是最简单的,然后使用stringstream构建输出;无需来回插入:

std::map<char, int> counts;

for (char ch : inStr)
    ++counts[ch];

std::ostringstream out;

for (char ch : inStr)
    out << ch << counts[ch];

std::cout << out.str() << std::endl;

这就是问题所在?请发布一个测试主函数提示:不需要预先声明迭代器,实际上这样做只会混淆代码。使用自动itr=。。。甚至更好的是,这一点。您还应该避免在不属于空间的声明中引入空间。vector::iterator是首选形式,因为::iterator是该类型不可分割的一部分,而不是附加在末尾的某些修饰符。提示:“0”+n是一种非常便宜的整数到字符转换。如果n在0-9范围内,如果您真的希望它是vector,您可以将int转换为std::string并推送它的所有元素。计算句子中的单词数,单词etc中的字符-是使用关联数组(如std::map或std::unordered_map)的经典示例,但对于8位字符(可能是多余的),使用带有256个元素的数组更简单、更有效。对于向量,使用emplace_back而不是push_back,速度更快。我怀疑std有什么区别:vector@Slava是的。对于int,没有任何区别。但我想让他知道emplace_back的用法。我还要补充一些不幸的是,你的陈述表达了这样一种观点,那就是回位总是更快。这是令人困惑和误导的。特别是当你回答关于性病的问题时:vector@Slava和김선달, 我真的很感谢你的投入!而您为我提供了干净、有效的代码。为了理解静态类型转换不应该在初始程序中工作的原因,我仍然处于修复状态:“char tempChar=static_cast*itr2;charnCount.emplace\u backtempChar;//这句话好像不管用!!'@Manasa我猜是因为你在打印字符。假设tempChar是13,而不是它在ASCII中的回车。字符串3在ASCII码中实际上是51。所以你必须像@tadman在评论中说的那样,或者把int转换成string。谢谢@M.M,代码看起来简单而优雅!
std::map<char, int> counts;

for (char ch : inStr)
    ++counts[ch];

std::ostringstream out;

for (char ch : inStr)
    out << ch << counts[ch];

std::cout << out.str() << std::endl;