我尝试将字符串值的示例向量按字母顺序插入到预先排序的列表中(并且不使用/编写排序函数)。我正确地获得了部分代码,其中一个字符串将被插入到列表中。然而,由于我不太熟悉迭代器,我的if语句是不完整的,字符串随后会被连续推送到满足条件的所有值。
#include <iostream>
#include <list>
#include <vector>
#include <string>
std::list<std::string> update(std::list<std::string>& data, std::vector<std::string> add){
std::vector<std::string>::iterator add_itr;
std::list<std::string>::iterator data_itr;
for (data_itr = data.begin(); data_itr != data.end(); data_itr++){
for (add_itr = add.begin(); add_itr != add.end(); add_itr++){
//this condition is incomplete
if (*add_itr < *data_itr)
data.insert(data_itr, *add_itr);
}
}
return data;
}
void print(const std::string &label, const std::list<std::string> &data) {
std::cout << label;
for (std::list<std::string>::const_iterator itr = data.begin();
itr != data.end(); itr++) {
std::cout << " " << *itr;
}
std::cout << std::endl;
}
int main() {
std::list<std::string> data;
data.push_back("antelope");
data.push_back("catfish");
data.push_back("giraffe");
data.push_back("llama");
data.push_back("jellyfish");
data.push_back("whale_shark");
data.push_back("zebra");
std::vector<std::string> add;
add.push_back("tiger");
add.push_back("llama");
add.push_back("elephant");
print ("before:",data);
update(data,add);
print ("after: ",data);
}我认为if语句的另一个条件应该是&& *add_itr > *(前一个位置中的数据字符串),但我不确定如何正确地迭代列表迭代器并编写以下代码。
任何帮助都将不胜感激!
发布于 2018-02-22 13:35:25
首先,你应该开始使用自动,因为它更容易阅读和遵循。因此,与其声明
std::vector<std::string>::iterator add_itr;您可以直接使用:
for (auto add_itr = add.begin(); add_itr != add.end(); add_itr++){现在,对于解决方案,您不需要迭代列表data。只需迭代向量并将值插入列表中。
发布于 2018-02-22 15:37:17
在C++中,迭代器面向泛型编程。这意味着您可以只编写一次集合处理算法,然后将其用于任意集合集,只要它们支持迭代器概念。
下面是如何以通用的方式实现所需的内容。
template<typename T, typename K>
void update(T& sortedValues, const K& valuesToAdd) {
for (auto value : valuesToAdd) {
auto position = std::lower_bound(sortedValues.begin(), sortedValues.end(), value);
sortedValues.insert(position, value);
}
}当然,如果有必要,您可以始终更具体地说明集合类型。
注意:在预先排序的列表中,"jellyfish“应该在"llama”之前。
发布于 2018-02-22 20:29:17
这在很大程度上取决于底层数据结构,因为您使用的是std::list来保存排序后的值,在这种情况下,最好使用std::list的成员函数:
void update(std::list<std::string>& data, const std::vector<std::string>& add){
std::list<std::string> sortedAdd(std::begin(add), std::end(add));
sortedAdd.sort();
data.merge(std::move(sortedAdd));
}https://stackoverflow.com/questions/48920200
复制相似问题