C++ 如何在char向量中插入整型向量值
对于“alpha”输入,我的函数需要输出一个值“a2l1p1h1a2”。 然而,我面临着将整数值从整数向量插入到字符向量的问题。 下面是代码片段。非常感谢您的任何建议/建议/观察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
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;