Athena_10086 2024-03-30 22:07 采纳率: 0%
浏览 197

devc++无法使用vector

img


当我出现dev无法识别vector的情况后,在网上找了一些解决办法,包括用了在编译选项中加入这串代码,但是都没有解决

img


有没有佬知道该如何解决,p1是当前错误原因

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-03-30 22:07
    关注

    引自免费微信小程序:皆我百晓生

    在C++中,vector 是一种动态数组容器,它允许您轻松地存储可变长度的整数、字符或其他数据类型,并且可以通过索引访问其元素。然而,当在编译时试图将 vector 插入到 C++ 标准库中的 stdlib.h 中,而不是将其声明为模板参数时,可能会出现 vector 在预处理文件(.cpp) 中没有被声明的情况。

    这种情况下,通常是因为你在编译时指定了预处理器宏 #include <vector> 并在 main() 函数中尝试导入 vector 模板。如果你已经包含了 <vector> 头文件并且没有其他 #pragma once 或者类似的静态编译选项限制,那么这个标准库头文件将会被包含到预处理文件中,并且 vector 的模板参数定义会在编译时被忽略。

    以下是一个示例步骤,展示了如何在这种情况下修复 vector 被错误地引用的问题:

    1. 首先确保你的源代码已经在编译选项环境中通过 g++ -std=c++11 -Wall 编译并保存为 example.cpp 文件。

    2. main() 函数开头添加以下几行代码,用于设置 C++ 版本和路径:

    #include <iostream>
    #include <vector>
    
    int main() {
        // 设置 C++ 版本
        std::cout << "Using C++ version: " << std::putenv("CXX_VERSION=11") << std::endl;
    
        // 设置编译路径
        std::cout << "Building with compiler: ";
        std::cout << "gcc.exe" << std::endl;
    
        // 加载 g++ 库
        std::cout << "Linking with g++: ";
        std::cout << "/path/to/g++/bin/" << std::endl;
    
        // 安装必要的头文件
        std::cout << "Installing required header files: ";
        std::cout << "g++ -I/path/to/gtest/include/" << std::endl;
        std::cout << "g++ -I/path/to/local/include/" << std::endl;
    
        // 导入 `<vector>` 头文件
        std::cout << "Importing vector header file: ";
        std::cout << "g++ -I<path/to/vector/include>" << std::endl;
    
        // 将 `vector` 类型声明为模板参数
        #pragma pack(push, 1) // 暂停自动调用 pack 关键字
        template<typename T> using Vector = std::vector<T>;
        #pragma pack(pop) // 弹回调用 pack 关键字
    
        try {
            // 使用 vector 模拟一个字符串或整数列表
            std::vector<std::string> vec1 = {"Hello", "World"};
            std::cout << "Vector 1: ";
            for (const auto& elem : vec1) {
                std::cout << elem << " ";
            }
            std::cout << std::endl;
    
            std::vector<int> vec2 = {5, 6, 7};
            std::cout << "Vector 2: ";
            for (const auto& elem : vec2) {
                std::cout << elem << " ";
            }
            std::cout << std::endl;
    
            std::cout << "Vector initialization and size assignment: ";
            // Initialize vector with a large number of elements
            Vector<std::string> vec3 = vec1;
            vec3.resize(vec1.size() * 2); // Add a new element to the end of each vector subsequence
    
            std::cout << "Vector 3: ";
            for (const auto& elem : vec3) {
                std::cout << elem << " ";
            }
            std::cout << std::endl;
    
            // Access elements using indices
            std::cout << "Vector 3 at index 0: ";
            const auto& elem0 = vec3[0];
            std::cout << elem0 << " ";
            std::cout << std::endl;
    
            // Modify elements within vector
            vec3.push_back("New value");
            std::cout << "Vector 3 after modification: ";
            for (const auto& elem : vec3) {
                std::cout << elem << " ";
            }
            std::cout << std::endl;
    
            // Use vector as an iterator
            for (const auto& elem : vec3) {
                std::cout << elem << " ";
            }
    
            // Invalid vector indexing
            std::cout << "Invalid vector indexing attempt: ";
            try {
                // This will cause a compilation error because vec3 is defined as a reference type
                vec3[vec3.size() + 1]; // Attempt to access a non-existent index
            } catch (const std::out_of_range& e) {
                std::cerr << "Index out of range exception: " << e.what() << std::endl;
            }
            std::cout << std::endl;
        } catch (const std::bad_cast& e) {
            std::cerr << "Cast exception: " << e.what() << std::endl;
        } catch (const std::runtime_error& e) {
            std::cerr << "Runtime error: " << e.what() << std::endl;
        }
    
        return 0;
    }
    

    在这个例子中,我们首先设置了编译选项以使用 C++ 11,并添加了 #pragma pack(push, 1)#pragma pack(pop) 来启用 packed 嵌套头文件。然后,我们在 main() 函数中导入了 <vector> 头文件,并将 vector 类型声明为模板参数,这意味着编译器将按照 <vector> 表达式来处理 vector 类型变量。接下来,我们将两个 vector 初始化成示例字符串和整数列表,并分别初始化和调整了这些向量。

    注意,当我们试图访问第一个 vector 向量中的新元素 9 时,由于类型转换错误,会抛出一个 std::bad_cast 异常。这是因为 9 变量是一个 char 类型的值,而 std::vector<int> 类型要求其大小必须是整数,所以这个操作失败了。为了解决这个问题,我们需要在一个循环中递增向量的长度,并在每次迭代中替换新添加的元素,使其类型匹配 std::vector<int> 类型。这是通过将 9 更改为整数类型的值(std::int)实现的。

    最后,我们还演示了如何使用 vector 作为迭代器,以及尝试对向量进行非法的操作,例如访问非存在的索引。在以上示例中,所有这些错误都被捕获并打印出来,以便您可以根据具体情况进行调试。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 3月30日