【发布时间】:2020-01-30 15:56:44
【问题描述】:
我尝试编写将元素插入向量的程序,并按字母顺序对它们进行排序。之前要插入的元素与另一个元素进行比较,直到它超过已插入的元素。在假定使用.insert() 添加比较元素之后。我想在不使用排序算法的情况下实现它。
std::string name;
std::vector<std::string> students;
std::vector<std::string>::iterator beg = students.begin();
while (std::cin>>name){
for (std::vector<std::string>::iterator e = students.end() ; beg !=e ; ) {
if (!name.compare(*beg))
{
students.insert(beg, name);
break;
}
else
beg++;
}
}
为了避免指向最后一个元素的迭代器失效,我每次迭代都会更新它。 问题是在这部分代码之后我检查了向量但它是空的。
【问题讨论】:
-
尽管您声称,显示的代码显然不会“在每次迭代中更新它”。所示代码的哪一部分在每次迭代时正确重置了
beg迭代器?未定义的行为。 -
真的,我改一下
-
另外,
compare()不是一个布尔函数,并且不会按照您认为的方式工作。你的比较是错误的。 -
措辞上的挑剔:根据定义,不使用算法就无法排序。任何让你对向量进行排序的代码都是算法的实现。我猜你的意思是
<algorithm>没有标准算法。但为什么?另请注意,在每个insert之后进行排序不是很有效。最好接受所有输入,然后排序 -
@Konstantin 您将其标记为
algorithm,所以这里是——您应该使用std::lower_bound或std::upper_bound。vector已经排序,因此通过二进制搜索项目应该去的地方更有效地将项目插入排序向量中,而不是从头开始并比较每个元素。
标签: c++ string algorithm vector stl