Обратите внимание, что проблема здесь решена, и она не имеет ничего общего со вставкой, а является неинициализированной переменной члена структуры! Надеюсь, этот вопрос и его ответ могут помочь другому новичку избежать такой ошибки.
Я хочу вставить std :: vector имен файлов в набор std :: set, который имеет структуру сортировки клиента для упорядочивания файлов по дате, а не по алфавиту.
С алфавитным порядком по умолчанию я могу просто вставить вектор в мой набор, используя:
std::set<std::string> mySet;
std::vector<std::string> myVector;
myVector.push_back("Banana.txt");
myVector.push_back("Apple.txt");
myVector.push_back("Cat.txt");
mySet.insert(myVector.begin(), myVector.end());
И это дало бы мне именно то, что я ожидал: std :: набор имен файлов, которые будут упорядочены в алфавитном порядке.
Теперь, если у меня есть собственный сортировщик, который сортирует по дате, а не по имени файла, вот так:
struct DateOrderSorter
{
bool operator()(const std::string& file1, const std::string& file2)
{
struct stat buf_stat1;
struct stat buf_stat2;
std::string fullpath1 = path + file1;
std::string fullpath2 = path + file2;
stat(&fullpath1[0], &buf_stat1);
stat(&fullpath2[0], &buf_stat2);
return buf_stat1.st_ctime < buf_stat2.st_ctime;
}
std::string path;
};
И я объявляю свой набор как:
std::set<std::string, DateOrderSorter>
и затем объявить экземпляр DateOrderSorter:
DateOrderSorter dateOrderSorter;
dateOrderSorter.path = "C:/random_path_that_has_been_verified_to_work"
Когда я делаю ту же вставку:
mySet.insert(myVector.begin(), myVector.end());
Возвращает только первый и последний файлы, отсортированные по дате. Так что просто myVector.begin () и myVector.end ().
- Прежде всего, почему это поведение?
- Что я могу сделать, чтобы вектор был вставлен в мой набор, заказанный через сортировщик клиентов.
Я пробовал
std::vector<std::string>::iterator vector_it = myVector.begin();
std::vector<std::string>::iterator vector_end = myVector.end();
for (; vector_it!= vector_end; ++vector_it) {
mySet.insert(*vector_it);
}
Но это не копировало вектор полностью, и порядок был очень странным. Это не следовало за именем или датой заказа ..