您可以使用std::map 来跟踪已知的字符串计数器,例如:
#include <string>
#include <map>
std::string names_str[7] = {"Alex", "Louis", "Alex", "Simon", "Matthew", "Carl", "Simon"};
int names[7];
std::map<std::string, int> counter_map;
int counter = 0;
for (int i = 0; i < 7; ++i)
{
auto iter = counter_map.find(names_str[i]);
if (iter == counter_map.end())
iter = counter_map.insert(std::make_pair(names_str[i], counter++)).first;
names[i] = iter->second;
}
Live Demo
另外,如果键已经存在,insert() 会向现有键控元素返回 iterator,因此您可以通过 find() 避免冗余搜索:
#include <string>
#include <map>
std::string names_str[7] = {"Alex", "Louis", "Alex", "Simon", "Matthew", "Carl", "Simon"};
int names[7];
std::map<std::string, int> counter_map;
int counter = 0;
for (int i = 0; i < 7; ++i)
{
auto ret = counter_map.insert(std::make_pair(names_str[i], counter));
if (ret.second) ++counter;
names[i] = ret.first->second;
}
Live Demo
无论哪种方式,由于您想将一个数组“转换”为另一个相同大小的数组,这对于std::transform() 来说是一个很好的用例:
#include <string>
#include <map>
#include <algorithm>
std::string names_str[7] = {"Alex", "Louis", "Alex", "Simon", "Matthew", "Carl", "Simon"};
int names[7];
std::map<std::string, int> counter_map;
int counter = 0;
std::transform(std::begin(names_str), std::end(names_str), std::begin(names),
[&](const std::string &name) {
auto iter = counter_map.find(name);
if (iter == counter_map.end())
iter = counter_map.insert(std::make_pair(name, counter++)).first;
return iter->second;
}
);
Live demo
#include <string>
#include <map>
#include <algorithm>
std::string names_str[7] = {"Alex", "Louis", "Alex", "Simon", "Matthew", "Carl", "Simon"};
int names[7];
std::map<std::string, int> counter_map;
int counter = 0;
std::transform(std::begin(names_str), std::end(names_str), std::begin(names),
[&](const std::string &name) {
auto ret = counter_map.insert(std::make_pair(name, counter));
if (ret.second) ++counter;
return ret.first->second;
}
);
Live Demo