标签: stdvector

"static const int"导致链接错误(未定义引用)

使用以下代码时,我对链接器错误感到困惑:

// static_const.cpp -- complete code
#include <vector>

struct Elem {
    static const int value = 0;
};

int main(int argc, char *argv[]) {
    std::vector<Elem> v(1);
    std::vector<Elem>::iterator it;

    it = v.begin();
    return it->value;
}
Run Code Online (Sandbox Code Playgroud)

但是,这在链接时失败 - 不知何故,它需要有一个静态const"值"的符号.

$ g++ static_const.cpp 
/tmp/ccZTyfe7.o: In function `main':
static_const.cpp:(.text+0x8e): undefined reference to `Elem::value'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

顺便说一句,这与-O1或更好的编译很好; 但对于更复杂的情况,它仍然失败.我使用的是gcc版本4.4.4 20100726(Red Hat 4.4.4-13).

任何想法我的代码可能有什么问题?

c++ static gcc const stdvector

14
推荐指数
2
解决办法
1万
查看次数

在两个范围内按降序对向量进行排序

假设我有一个整数向量:

std::vector<int> indices;
for (int i=0; i<15; i++) indices.push_back(i);
Run Code Online (Sandbox Code Playgroud)

然后我按降序排序:

sort(indices.begin(), indices.end(), [](int first, int second) -> bool{return indices[first] > indices[second];})
for (int i=0; i<15; i++) printf("%i\n", indices[i]);
Run Code Online (Sandbox Code Playgroud)

这会产生以下结果:

14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
Run Code Online (Sandbox Code Playgroud)

现在我想将数字 3、4、5 和 6 移到最后,并保持它们的降序(最好不必sort第二次使用)。即,这是我想要的:

14
13
12
11
10
9
8
7
2
1
0
6
5
4
3
Run Code Online (Sandbox Code Playgroud)

我应该如何修改 的比较功能std::sort来实现这一点?

c++ sorting vector stdvector c++11

14
推荐指数
2
解决办法
414
查看次数

制作循环迭代器(循环器)的最简单方法?

我有一个对象,我想在游戏中连续循环旅行.我有一系列坐标std::vector,我想用作航点.

有没有办法制作std::vector<T>::iterator循环(也称为循环器)?

我能想到的最好的是拥有两个迭代器,然后每当第一个迭代器耗尽时,为它分配第二个迭代器的值(不会用于做任何其他事情)但我甚至不确定它是否会起作用 - 将赋值运算符复制迭代器用于保存索引的任何内容,还是只引用它(因此在第二轮之后将无用)?

我希望对象永远地沿着路点行进(除非它被破坏但在该方法中不会发生),但迭代器只会为每个帧调用一次并且必须返回以便我可以更新游戏中的其他对象.

该解决方案必须适用于gcc和microsoft编译器(如果无法在标准C++中编写它).

c++ stdvector

13
推荐指数
2
解决办法
5550
查看次数

为什么我不能在即时窗口中索引std :: vector?

所以,我有一个向量

 std::vector<std::string> lines. 
Run Code Online (Sandbox Code Playgroud)

我填写这个向量,可以像访问它一样

 std::string temp = lines[0];
Run Code Online (Sandbox Code Playgroud)

但是,在即时窗口中,两者都有

 lines[0] - error:overloaded operator not found
Run Code Online (Sandbox Code Playgroud)

和

 lines.at(0) - error:symbol is ambiguous
Run Code Online (Sandbox Code Playgroud)

根本不工作.使用c ++的即时窗口有一个技巧.我主要是来自C#背景,一切都很好(我在立即窗口中有智能感知).我并不认为C++会很棒,但我认为它可以用于除了int之外的东西.谁能告诉我我做错了什么?谢谢.

编辑:我应该清楚,在即时窗口中没有任何实际工作,这只是一个简化的例子

编辑:我在调试模式

c++ immediate-window stdvector visual-studio

13
推荐指数
1
解决办法
4585
查看次数

将uint8的矢量转换为字符串

我有一个指向uint8类型向量的指针.

我如何获取此指针并将向量中的数据转换为代表其内容的完整字符串?

c++ string stdstring stdvector uint8t

13
推荐指数
2
解决办法
1万
查看次数

如何将犰狳矩阵转换为向量矢量?

我创建了一个armadillo c ++矩阵,如下所示:

arma::mat A; 
A.zeros(3,4);
Run Code Online (Sandbox Code Playgroud)

我想将它转换为由定义的向量向量

std::vector< std::vector<double> > B(3, std::vector<double>(4) ); 
Run Code Online (Sandbox Code Playgroud)

如何将B设置为A?如果对于矢量矢量没有简单的方法,那么阵列数组呢,即如果我将B定义为什么

double B[3][4]; 
Run Code Online (Sandbox Code Playgroud)

c++ arrays stdvector armadillo

13
推荐指数
1
解决办法
8660
查看次数

未使用的STL容器是否分配内存?

鉴于代码:

class Foo {
  std::vector<int> items;
  std::map<int, int> dictionary;
};
Run Code Online (Sandbox Code Playgroud)
  1. 如果没有任何东西被添加到上面的矢量或地图中,还是会分配一块缓冲存储器吗?(换句话说,缓冲区分配总是在容器创建期间发生,还是可以在调用push_back之类的函数之前推迟?)

  2. 是否存在处理初始STL容器缓冲区分配时间的标准,或者是否允许STL容器和编译器之间的行为不同?

注意:这个问题不是关于这样的容器会增加类Foo大小的额外字节.

(这个问题的一个相关子集强调分配大小是C++中向量的初始容量.)

c++ stl allocation stdmap stdvector

13
推荐指数
2
解决办法
1551
查看次数

通过const_cast修改const std :: vector &lt;T&gt;的元素

以下程序是否具有未定义的行为?

#include <iostream>
#include <vector>

struct Foo
{
    const std::vector<int> x;
};

int main()
{
    std::vector<int> v = {1,2,3};
    auto f = new Foo{v};
    const_cast<int&>(f->x[1]) = 42; // Legal?
    std::cout << f->x[1] << "\n";
}
Run Code Online (Sandbox Code Playgroud)

需要注意的是它不使用const_cast剥离从常量性f->x,而是从汽提常量性f->x[x],这大概是由一个单独的数组来表示。还是在创建翻译f->x[1]后就假定它是不可变的?

c++ stl const-cast stdvector language-lawyer

13
推荐指数
1
解决办法
189
查看次数

使 std::vector 分配对齐内存的现代方法

在以下问题是相关的,但答案是旧的,并且从用户评论马克Glisse表明有因为C ++ 17的新方法这个问题可能没有得到充分讨论。

我试图让对齐的内存为 SIMD 正常工作,同时仍然可以访问所有数据。

在 Intel 上,如果我创建一个类型为 的浮点向量__m256,并将我的大小减小 8 倍,它会给我对齐的内存。

例如 std::vector<__m256> mvec_a((N*M)/8);

以一种稍微有点麻烦的方式,我可以将指向向量元素的指针转换为浮点,这允许我访问单个浮点值。

相反,我更喜欢std::vector<float>正确对齐的 ,因此可以加载到__m256其他 SIMD 类型中而不会出现段错误。

我一直在研究aligned_alloc。

这可以给我一个正确对齐的 C 样式数组:

auto align_sz = static_cast<std::size_t> (32);
float* marr_a = (float*)aligned_alloc(align_sz, N*M*sizeof(float));
Run Code Online (Sandbox Code Playgroud)

但是我不确定如何为std::vector<float>. 授予的std::vector<float>所有权marr_a 似乎是不可能的。

我已经看到一些建议我应该编写自定义分配器,但这似乎需要做很多工作,也许现代 C++ 有更好的方法?

c++ simd memory-alignment stdvector c++17

13
推荐指数
2
解决办法
729
查看次数

对于此 MSVC 特定向量 &lt;unordered_map&lt;Trivial, NonCopyable&gt;&gt; 错误有任何解决方法吗?

以下代码在 MSVC 上确实失败,但在 GCC 和 Clang、godbolt上编译

#include <unordered_map>
#include <vector>
using namespace std;

struct NonCopyable
{
    NonCopyable() = default;
    NonCopyable(NonCopyable const &) = delete;
    NonCopyable(NonCopyable &&) = default;
};

int main()
{
    using Data = unordered_map<int, NonCopyable>;

    vector<Data> vec;

    vec.reserve(3);     // error
    vec.resize(3);      // error
    vec.emplace_back(); // error

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是我在做项目时偶然发现的案例的简化版本。我从一开始就使用 MSVC,所以我更喜欢一种解决方法(如果可能的话)而不是更改编译器。

据我从错误消息中了解到,vector尝试复制构造一个pair<Trivial, NonCopyable>. 哪个,,它不应该,,,但我知道没有办法告诉它不要这样做:/

  • 当Data = map<int, NonCopyable>MSVC 因相同的错误而失败时,而其他人则编译。
  • 如果我使用,所有编译器都很好Data = pair<int, NonCopyable>;,因此尝试复制构造一对的容器可能是 unorderd_map
  • 如果我构建具有正确大小的向量,它就会起作用。但是,就我而言,我不能这样做。

谢谢

c++ move stdvector

13
推荐指数
1
解决办法
217
查看次数