Короче говоря. Я пытаюсь запустить этот код в VS Studio IDE.
#include <iostream>
#include <vector>
using std::vector;
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
for(int i = 0; i < nums.size(); i++){
for(int j = i + 1; j < nums.size(); j++){
if (nums[i] + nums[j] == target){
return {i, j};
}
}
}
return {};
}
};
Мне пришлось добавить #include, чтобы решить первую проблему. Но теперь его высказывание:
использование-объявление для не-члена в области класса
ожидаемый неквалифицированный идентификатор перед токеном '<'
Сюжет сгущается. Он отлично работает на leetcode без #include . Ничего из этого не происходит.
Проблема с вектором или что? И почему код VS Studio ненавидит это, но отлично работает на leetcode? https://leetcode.com/problems/two-sum/solutions/1439021/c-brute-force-hashmap-solutions/?q=brute&orderBy=most_votes&languageTags=cpp
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
for(int i = 0; i < nums.size(); i++){
for(int j = i + 1; j < nums.size(); j++){
if (nums[i] + nums[j] == target){
return {i, j};
}
}
}
return {};
}
};
код ОГ.
Заранее спасибо.
VSCode жалуется. Можете ли вы уточнить, что вы подразумеваете под компиляцией в программу? @drescherjm 'C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32 /bin/ld.exe: C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../lib /libmingw32.a(lib64_libmingw32_a-crtexewin.o): в основной функции: C:/M/mingw-w64-crt-git/src/mingw-w64/mingw-w64-crt/crt/crtexewin .c:70: неопределенная ссылка на `WinMain' collect2.exe: ошибка: ld вернул 1 статус выхода' Сейчас это происходит с добавлением int main(), но это происходило и раньше.
В С++ требуется основная функция. Этот ответ объясняет, что такое действительные подписи:
Если вы сохранили свой файл и у вас есть int main() { // code here }
, у вас не должно быть ошибки о WinMain. Компоновщик в MinGW сначала ищет main(), затем WinMain, если он не находит ни того, ни другого, он заканчивается ошибкой о WinMain. Также обратите внимание, что запуск задач сборки или отладки не будет автоматически сохранять ваш код по умолчанию.
@drescherjm Ну, int main() есть, и это дало мне это. Так что должен быть другой элемент или причина, по которой это произойдет. Если только моя идея не настроена правильно. Я не понимаю, что ты пытаешься сказать. Это здесь. Но да, я сохраняю его, прежде чем бежать. Спасибо.
«неопределенная ссылка на WinMain
» говорит мне, что вы, вероятно, создали свое решение как приложение с графическим интерфейсом Windows, а не как консольное приложение. Компоновщик ищет функцию точки входа GUI (WinMain
) вместо стандартной точки входа C++ (main
). Создайте новое решение и настройте его как консольное приложение.
int main()
находится в другом исходном файле? Помните, что VSCode по умолчанию создает только активный файл. В режиме по умолчанию без расширений сборки, таких как CMakeTools или MakeFileTools, вам необходимо отредактировать файл tasks.json, если у вас есть более 1 файла cpp.
@drescherjm Что ж, удаление int main из другого файла .cpp, похоже, предотвратило появление этой ошибки. Но теперь он «пустой» и делает то же самое, что я разместил здесь в Edit 2 с консоли.
Кстати, вот информация о том, как заставить VSCode скомпилировать более 1 файла: https://code.visualstudio.com/docs/cpp/config-mingw#_modifying-tasksjson
Хотя я бы НЕ рекомендовал использовать using
на уровне заголовка из-за конфликтов пространств имен, если вы действительно хотите его использовать, рассмотрите вариант ниже:
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
for(int i = 0; i < nums.size(); i++){
for(int j = i + 1; j < nums.size(); j++){
if (nums[i] + nums[j] == target){
return {i, j};
}
}
}
return {};
}
};
Тем не менее, большинство людей согласятся, что приведенный ниже подход выглядит более «современным».
#include <iostream>
#include <vector>
#include <tuple>
#include <optional>
class Solution {
public:
std::optional< std::tuple<int,int> > twoSum( const std::vector<int>& nums, int target) {
for( int i = 0; i < nums.size(); i++) {
for(int j = i + 1; j < nums.size(); j++) {
if ( nums[i] + nums[j] == target){
return {{i, j}};
}
}
}
return {};
}
};
int main() {
std::vector<int> vec{1,2,3,4};
int total = 5;
Solution s;
auto result = s.twoSum( vec, total );
if ( result ) {
auto [i,j] = result.value();
std::cout << vec[i] << " + " << vec[j] << " = " << total << std::endl;
}
}
Это сработало. Но я едва понимаю, почему это работает. Кажется, вы разделили их и сделали основным еще один экземпляр. Кажется, вы также переписали код и по-другому определили вектор. Не понимаю. Но спасибо конечно. Но не понимаю ответа, ха-ха
Ответ только первый. Второй код — это просто улучшение с использованием optional
и tuple
.
А, тогда не работает. Это снова дает мне это: C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w6 4-mingw32/bin/ld.exe: C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../.. /lib/libmingw32.a(lib64_libmingw32_a-crtexewin.o): в функции main': C:/M/mingw-w64-crt-git/src/mingw-w64/mingw-w64-crt/crt/crtexewin.c:70: undefined reference to
WinMain' collect2.exe: ошибка: ld вернул 1 статус выхода
Вам нужна основная функция, чтобы она что-то делала с этим классом.
Класс решения? Итак, мне нужно искать функции для решения класса?
Поэтому я добавил int main() и добавил ';' ко всем строкам он продолжал говорить, что ожидал один в, и теперь он дает мне пустой пробег. Теперь он работает, так что это прогресс? См. Редактировать 2. @Ноле Ксум
Вы получаете ошибку компиляции в VSCode или это просто редактор жалуется? Также код не должен компилироваться в программу, потому что в нем отсутствует
int main()