标签: stdvector

如何计算向量的向量

如何std::count根据最里面向量的第二个值来计算向量向量?

我将向量声明为:

vector< vector<int> > distance(data.size(),vector<int>(3)); 
Run Code Online (Sandbox Code Playgroud)

c++ stdvector

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

对象向量的初始化列表

我有以下示例代码。是否可以在不指定对象向量中的“测试”的情况下初始化对象列表,或者这是最好的方法?谢谢。

class Test {
public:
    Test(const std::initializer_list<int> list) : m_(list) {

    }

private:
    std::vector<int> m_;
};

int main(int argc, char **argv) {
    std::vector<Test> v = { Test({1, 2, 3}), Test({1, 2, 4}) };


}
Run Code Online (Sandbox Code Playgroud)

c++ stdvector initializer-list c++11

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

C++ 将 std::vector&lt;char*&gt; 转换为 char**

如何在 C++ 中将 std::vector强制转换或转换为 char**?

我使用 std::vector 是因为我需要在循环内推送一些字符串,但随后我必须调用需要 char** 的 C 函数。

c++ casting stdvector

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

如何放置到 std::array 的 std::vector?

使用向量向量,我可以这样做:

std::vector<std::vector<int>> vov;
vov.emplace_back(std::initializer_list<int>{0, 0});
Run Code Online (Sandbox Code Playgroud)

但是, std::array 的向量等效失败:

std::vector<std::array<int, 2>> voa;
voa.emplace_back(std::initializer_list<int>{0,0});
Run Code Online (Sandbox Code Playgroud)

在向量中放置数组的正确方法是什么?

编辑:

是的,您可以从初始化列表创建 std::array :

std::array<int, 2> a = {0, 0}
Run Code Online (Sandbox Code Playgroud)

工作正常。

错误:

error C2664: 'std::array<int,2>::array(const std::array<int,2> &)': cannot convert argument 1 from 'std::initializer_list<int>' to 'const std::array<int,2> &'
Run Code Online (Sandbox Code Playgroud)

c++ stdvector stdarray emplace

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

如何比较 vector&lt;float&gt; 和 float*

我需要比较两个浮点数组的值是否相等。我知道它们的长度相同。但不幸的是,数组的类型不同:

bool compare(vector<float> A, float* B) 
{
  // what do I write here?
}
Run Code Online (Sandbox Code Playgroud)

我该怎么做?我对指针不太熟悉。

c++ arrays pointers stdvector

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

为什么这个 C++ 工作?(变量的声明/定义)

为什么我可以在 for 循环的每次迭代中在 for 循环 [for (auto val: k0L){...}] 中声明和定义 3 个变量?当我执行 g++ code.cpp 时,编译器不会抱怨。我知道一个变量只能声明一次。我知道我不能写 int a = 5; int a = 6; 在 main() 范围内。但是,这就是我在 for 循环中所做的。谢谢!

#include <iostream>
#include <vector>
#include <fstream>
#include <math.h>
#include <algorithm>

#define PI 3.14159265

std::vector<double> linspace (double start, double end, size_t points) { // will be used in main(), details of this function are not important.
    std::vector<double> res(points);
    double step = (end - start) / (points - 1);
    size_t i = 0;
    for …
Run Code Online (Sandbox Code Playgroud)

c++ variables for-loop declaration stdvector

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

接收迭代器并返回向量的函数

我的任务是创建一个与以下相同的函数

template <typename It>
auto MakeSet(It range_begin, It range_end) {
     return set(range_begin, range_end);
}
Run Code Online (Sandbox Code Playgroud)

但它必须是一个模板,它接收迭代器(begin() 和 end())并返回一个包含范围内元素的向量。

我试过

template<typename Type, typename It>
auto MakeVector(It range_begin, It range_end) {
    return vector<Type> v(range_begin, range_end);
}
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误

无法识别的模板声明/定义

c++ iterator stdvector

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

从 std::vector 中擦除是否有比 swap-and-pop 更快的方法?

我问这个是因为关于 SO 的其他相关问题似乎是针对旧版本的 C++ 标准,没有提到任何形式的并行化,或者专注于在删除元素时保持排序/索引相同。

我有一个可能包含数十万或数百万个元素的向量(它们是相当轻的结构,假设它们被压缩了大约 20 个字节)。

由于其他限制,它必须是 astd::vector并且其他容器不起作用(例如std::forward_list),或者在其他用途​​中甚至不太理想。

我最近从简单的it = std::erase(it)方法切换到使用 pop-and-swap 使用这样的东西:

for(int i = 0; i < myVec.size();) {
  // Do calculations to determine if element must be removed
  // ...

  // Remove if needed
  if(elementMustBeRemoved) {
    myVec[i] = myVec.back();
    myVec.pop_back();
  } else {
    i++;
  }
}
Run Code Online (Sandbox Code Playgroud)

这是有效的,并且是一个显着的改进。它将方法的运行时间减少到以前的 61%。但我想进一步改进这一点。

C++ 是否有一种方法可以std::vector有效地从 a 中删除许多非连续元素?就像将索引向量传递给erase()C++ 并让 C++ 在幕后做一些魔术以最大程度地减少数据移动?

如果是这样,我可以让线程单独收集必须并行删除的索引,然后组合它们并将它们传递给擦除()。

c++ stdvector c++20

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

为什么对于 std::vector::resize() 的一个重载忽略了移动操作的抛出?

在 C++ 标准vector.capacity部分,它为 定义了两个重载resize()。(另见https://en.cppreference.com/w/cpp/container/vector/resize

此重载要求类型 T 是MoveInsertableand DefaultInsertable

constexpr void resize(size_type sz);
Run Code Online (Sandbox Code Playgroud)

另一个重载要求类型 T 是CopyInsertable

constexpr void resize(size_type sz, const T& c);
Run Code Online (Sandbox Code Playgroud)

标准中提到的部分的第 16 条规定了第一次重载:

如果非 Cpp17CopyInsertable T的移动构造函数引发异常,则不会产生任何影响。

但是对于第二次重载,它指出:

如果抛出异常,则没有任何影响。

第二个重载中没有提到移动构造函数的抛出。为什么?

c++ stdvector move-semantics

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

如何使用 std::vector 中的备用容量?

什么是安全、便携、惯用的方式来使用std::vector.

std::vector<Foo> foos;
foos.emplace_back(1);
foos.emplace_back(2);
foos.reserve(10);
Run Code Online (Sandbox Code Playgroud)

此时foos,至少拥有8 * sizeof(Foo)从 开始的未初始化的备用内存foos.data() + foos.size()。让这些内存浪费掉似乎非常低效。在Foo通过附加到用对象填充它之前,如何将此空闲容量用作暂存空间或用于其他目的foos?在不调用任何未定义行为的情况下执行此操作的正确方法是什么?

c++ stdvector

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